',
classes: {
// used to get elements from templates
button: 'qq-upload-button',
drop: 'qq-upload-drop-area',
dropActive: 'qq-upload-drop-area-active',
list: 'qq-upload-list',
nameInput: 'qq-upload-name-input',
overwriteInput: 'qq-overwrite-check',
uploadButton: 'qq-upload-action',
file: 'qq-upload-file',
spinner: 'qq-upload-spinner',
size: 'qq-upload-size',
cancel: 'qq-upload-cancel',
// added to list item when upload completes
// used in css to hide progress spinner
success: 'qq-upload-success',
fail: 'qq-upload-fail',
failedText: 'qq-upload-failed-text'
}
});
qq.extend(this._options, o);
this._element = this._options.element;
this._element.innerHTML = this._options.template;
this._listElement = this._options.listElement || this._find(this._element, 'list');
this._classes = this._options.classes;
this._button = this._createUploadButton(this._find(this._element, 'button'));
this._bindCancelEvent();
this._bindUploadEvent();
this._setupDragDrop();
};
qq.extend(qq.FileUploaderExtended.prototype, qq.FileUploader.prototype);
qq.extend(qq.FileUploaderExtended.prototype, {
_bindUploadEvent: function(){
var self = this,
list = this._listElement;
qq.attach(document.getElementById('mediamanager__upload_button'), 'click', function(e){
e = e || window.event;
var target = e.target || e.srcElement;
qq.preventDefault(e);
self._handler._options.onUpload();
jQuery(".qq-upload-name-input").each(function (i) {
jQuery(this).attr('disabled', 'disabled');
});
});
},
_onComplete: function(id, fileName, result){
this._filesInProgress--;
// mark completed
var item = this._getItemByFileId(id);
qq.remove(this._find(item, 'cancel'));
qq.remove(this._find(item, 'spinner'));
var nameInput = this._find(item, 'nameInput');
var fileElement = this._find(item, 'file');
qq.setText(fileElement, nameInput.value);
qq.removeClass(fileElement, 'hidden');
qq.remove(nameInput);
jQuery('.qq-upload-button, #mediamanager__upload_button').remove();
jQuery('.dw__ow').parent().hide();
jQuery('.qq-upload-drop-area').remove();
if (result.success){
qq.addClass(item, this._classes.success);
$link = '' + nameInput.value + '';
jQuery(fileElement).html($link);
} else {
qq.addClass(item, this._classes.fail);
var fail = this._find(item, 'failedText');
if (result.error) qq.setText(fail, result.error);
}
if (document.getElementById('media__content') && !document.getElementById('mediamanager__done_form')) {
var action = document.location.href;
var i = action.indexOf('?');
if (i) action = action.substr(0, i);
var button = '';
jQuery('#mediamanager__uploader').append(button);
}
}
});
qq.extend(qq.UploadHandlerForm.prototype, {
uploadAll: function(params){
this._uploadAll(params);
},
getName: function(id){
var file = this._inputs[id];
var name = document.getElementById('mediamanager__upload_item'+id);
if (name != null) {
return name.value;
} else {
if (file != null) {
// get input value and remove path to normalize
return file.value.replace(/.*(\/|\\)/, "");
} else {
return null;
}
}
},
_uploadAll: function(params){
jQuery(".qq-upload-spinner").each(function (i) {
jQuery(this).removeClass('hidden');
});
for (key in this._inputs) {
this.upload(key, params);
}
},
_upload: function(id, params){
var input = this._inputs[id];
if (!input){
throw new Error('file with passed id was not added, or already uploaded or cancelled');
}
var fileName = this.getName(id);
var iframe = this._createIframe(id);
var form = this._createForm(iframe, params);
form.appendChild(input);
var nameInput = qq.toElement('');
form.appendChild(nameInput);
var checked = jQuery('.dw__ow').is(':checked');
var owCheckbox = jQuery('.dw__ow').clone();
owCheckbox.attr('checked', checked);
jQuery(form).append(owCheckbox);
var self = this;
this._attachLoadEvent(iframe, function(){
self.log('iframe loaded');
var response = self._getIframeContentJSON(iframe);
self._options.onComplete(id, fileName, response);
self._dequeue(id);
delete self._inputs[id];
// timeout added to fix busy state in FF3.6
setTimeout(function(){
qq.remove(iframe);
}, 1);
});
form.submit();
qq.remove(form);
return id;
}
});
qq.extend(qq.UploadHandlerXhr.prototype, {
uploadAll: function(params){
this._uploadAll(params);
},
getName: function(id){
var file = this._files[id];
var name = document.getElementById('mediamanager__upload_item'+id);
if (name != null) {
return name.value;
} else {
if (file != null) {
// fix missing name in Safari 4
return file.fileName != null ? file.fileName : file.name;
} else {
return null;
}
}
},
getSize: function(id){
var file = this._files[id];
if (file == null) return null;
return file.fileSize != null ? file.fileSize : file.size;
},
_upload: function(id, params){
var file = this._files[id],
name = this.getName(id),
size = this.getSize(id);
if (name == null || size == null) return;
this._loaded[id] = 0;
var xhr = this._xhrs[id] = new XMLHttpRequest();
var self = this;
xhr.upload.onprogress = function(e){
if (e.lengthComputable){
self._loaded[id] = e.loaded;
self._options.onProgress(id, name, e.loaded, e.total);
}
};
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
self._onComplete(id, xhr);
}
};
// build query string
params = params || {};
params['qqfile'] = name;
params['ow'] = jQuery('.dw__ow').is(':checked');
var queryString = qq.obj2url(params, this._options.action);
xhr.open("POST", queryString, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.send(file);
},
_uploadAll: function(params){
jQuery(".qq-upload-spinner").each(function (i) {
jQuery(this).removeClass('hidden');
});
for (key in this._files) {
this.upload(key, params);
}
}
});
/* XXXXXXXXXX end of lib/scripts/fileuploaderextended.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/helpers.js XXXXXXXXXX */
/**
* Various helper functions
*/
/**
* A PHP-style substr_replace
*
* Supports negative start and length and omitting length, but not
* str and replace arrays.
* See http://php.net/substr-replace for further documentation.
*/
function substr_replace(str, replace, start, length) {
var a2, b1;
a2 = (start < 0 ? str.length : 0) + start;
if (typeof length === 'undefined') {
length = str.length - a2;
} else if (length < 0 && start < 0 && length <= start) {
length = 0;
}
b1 = (length < 0 ? str.length : a2) + length;
return str.substring(0, a2) + replace + str.substring(b1);
}
/**
* Bind variables to a function call creating a closure
*
* Use this to circumvent variable scope problems when creating closures
* inside a loop
*
* @author Adrian Lang
* @link http://www.cosmocode.de/en/blog/gohr/2009-10/15-javascript-fixing-the-closure-scope-in-loops
* @param functionref fnc - the function to be called
* @param mixed - any arguments to be passed to the function
* @returns functionref
*/
function bind(fnc/*, ... */) {
var Aps = Array.prototype.slice,
// Store passed arguments in this scope.
// Since arguments is no Array nor has an own slice method,
// we have to apply the slice method from the Array.prototype
static_args = Aps.call(arguments, 1);
// Return a function evaluating the passed function with the
// given args and optional arguments passed on invocation.
return function (/* ... */) {
// Same here, but we use Array.prototype.slice solely for
// converting arguments to an Array.
return fnc.apply(this,
static_args.concat(Aps.call(arguments, 0)));
};
}
/**
* Report an error from a JS file to the console
*
* @param e The error object
* @param file The file in which the error occurred
*/
function logError(e, file) {
if (window.console && console.error) {
console.error('The error "%s: %s" occurred in file "%s". ' +
'If this is in a plugin try updating or disabling the plugin, ' +
'if this is in a template try updating the template or switching to the "dokuwiki" template.',
e.name, e.message, file);
if(e.stack) {
console.error(e.stack);
}
}
}
/* XXXXXXXXXX end of lib/scripts/helpers.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/delay.js XXXXXXXXXX */
/**
* Manage delayed and timed actions
*
* @license GPL2 (http://www.gnu.org/licenses/gpl.html)
* @author Adrian Lang
*/
/**
* Provide a global callback for window.setTimeout
*
* To get a timeout for non-global functions, just call
* delay.add(func, timeout).
*/
var timer = {
_cur_id: 0,
_handlers: {},
execDispatch: function (id) {
timer._handlers[id]();
},
add: function (func, timeout) {
var id = ++timer._cur_id;
timer._handlers[id] = func;
return window.setTimeout('timer.execDispatch(' + id + ')', timeout);
}
};
/**
* Provide a delayed start
*
* To call a function with a delay, just create a new Delay(func, timeout) and
* call that object’s method “start”.
*/
function Delay (func, timeout) {
this.func = func;
if (timeout) {
this.timeout = timeout;
}
}
Delay.prototype = {
func: null,
timeout: 500,
delTimer: function () {
if (this.timer !== null) {
window.clearTimeout(this.timer);
this.timer = null;
}
},
start: function () {
DEPRECATED('don\'t use the Delay object, use window.timeout with a callback instead');
this.delTimer();
var _this = this;
this.timer = timer.add(function () { _this.exec.call(_this); },
this.timeout);
this._data = {
_this: arguments[0],
_params: Array.prototype.slice.call(arguments, 2)
};
},
exec: function () {
this.delTimer();
this.func.call(this._data._this, this._data._params);
}
};
/* XXXXXXXXXX end of lib/scripts/delay.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/cookie.js XXXXXXXXXX */
/**
* Handles the cookie used by several JavaScript functions
*
* Only a single cookie is written and read. You may only save
* simple name-value pairs - no complex types!
*
* You should only use the getValue and setValue methods
*
* @author Andreas Gohr
* @author Michal Rezler
*/
var DokuCookie = {
data: {},
name: 'DOKU_PREFS',
/**
* Save a value to the cookie
*
* @author Andreas Gohr
*/
setValue: function(key,val){
var text = [],
_this = this;
this.init();
this.data[key] = val;
//save the whole data array
jQuery.each(_this.data, function (key, val) {
if (_this.data.hasOwnProperty(key)) {
text.push(encodeURIComponent(key)+'#'+encodeURIComponent(val));
}
});
jQuery.cookie(this.name, text.join('#'), {expires: 365, path: DOKU_COOKIE_PARAM.path, secure: DOKU_COOKIE_PARAM.secure});
},
/**
* Get a Value from the Cookie
*
* @author Andreas Gohr
*/
getValue: function(key){
this.init();
return this.data[key];
},
/**
* Loads the current set cookie
*
* @author Andreas Gohr
*/
init: function(){
var text, parts, i;
if(!jQuery.isEmptyObject(this.data)) {
return;
}
text = jQuery.cookie(this.name);
if(text){
parts = text.split('#');
for(i = 0; i < parts.length; i += 2){
this.data[decodeURIComponent(parts[i])] = decodeURIComponent(parts[i+1]);
}
}
}
};
/* XXXXXXXXXX end of lib/scripts/cookie.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/script.js XXXXXXXXXX */
// if jQuery was loaded, let's make it noConflict here.
if ('function' === typeof jQuery && 'function' === typeof jQuery.noConflict) {
jQuery.noConflict();
}
/**
* Some browser detection
*/
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
var is_macos = navigator.appVersion.indexOf('Mac') != -1;
var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1) &&
(clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
var is_safari = ((clientPC.indexOf('applewebkit')!=-1) && (clientPC.indexOf('spoofer')==-1));
var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
if (clientPC.indexOf('opera')!=-1) {
var is_opera = true;
var is_opera_preseven = (window.opera && !document.childNodes);
var is_opera_seven = (window.opera && document.childNodes);
}
/**
* Handler to close all open Popups
*/
function closePopups(){
jQuery('div.JSpopup').hide();
}
jQuery(function () {
jQuery(document).click(closePopups);
});
/* XXXXXXXXXX end of lib/scripts/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/qsearch.js XXXXXXXXXX */
/**
* AJAX functions for the pagename quicksearch
*
* @license GPL2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr
* @author Adrian Lang
* @author Michal Rezler
*/
jQuery.fn.dw_qsearch = function (overrides) {
var dw_qsearch = {
output: '#qsearch__out',
$inObj: this,
$outObj: null,
timer: null,
curRequest: null,
/**
* initialize the quick search
*
* Attaches the event handlers
*
*/
init: function () {
var do_qsearch;
dw_qsearch.$outObj = jQuery(dw_qsearch.output);
// objects found?
if (dw_qsearch.$inObj.length === 0 ||
dw_qsearch.$outObj.length === 0) {
return;
}
// attach eventhandler to search field
do_qsearch = function () {
// abort any previous request
if (dw_qsearch.curRequest != null) {
dw_qsearch.curRequest.abort();
}
var value = dw_qsearch.getSearchterm();
if (value === '') {
dw_qsearch.clear_results();
return;
}
dw_qsearch.$inObj.parents('form').addClass('searching');
dw_qsearch.curRequest = jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'qsearch',
q: encodeURI(value)
},
dw_qsearch.onCompletion,
'html'
);
};
dw_qsearch.$inObj.keyup(
function () {
if (dw_qsearch.timer) {
window.clearTimeout(dw_qsearch.timer);
dw_qsearch.timer = null;
}
dw_qsearch.timer = window.setTimeout(do_qsearch, 500);
}
);
// attach eventhandler to output field
dw_qsearch.$outObj.click(dw_qsearch.clear_results);
},
/**
* Read search term from input
*/
getSearchterm: function() {
return dw_qsearch.$inObj.val();
},
/**
* Empty and hide the output div
*/
clear_results: function () {
dw_qsearch.$inObj.parents('form').removeClass('searching');
dw_qsearch.$outObj.hide();
dw_qsearch.$outObj.text('');
},
/**
* Callback. Reformat and display the results.
*
* Namespaces are shortened here to keep the results from overflowing
* or wrapping
*
* @param data The result HTML
*/
onCompletion: function (data) {
var max, $links, too_big;
dw_qsearch.$inObj.parents('form').removeClass('searching');
dw_qsearch.curRequest = null;
if (data === '') {
dw_qsearch.clear_results();
return;
}
dw_qsearch.$outObj
.html(data)
.show()
.css('white-space', 'nowrap');
// disable overflow during shortening
dw_qsearch.$outObj.find('li').css('overflow', 'visible');
$links = dw_qsearch.$outObj.find('a');
max = dw_qsearch.$outObj[0].clientWidth; // maximum width allowed (but take away paddings below)
if (document.documentElement.dir === 'rtl') {
max -= parseInt(dw_qsearch.$outObj.css('padding-left'));
too_big = function (l) {
return l.offsetLeft < 0;
};
} else {
max -= parseInt(dw_qsearch.$outObj.css('padding-right'));
too_big = function (l) {
return l.offsetWidth + l.offsetLeft > max;
};
}
$links.each(function () {
var start, length, replace, nsL, nsR, eli, runaway;
if (!too_big(this)) {
return;
}
nsL = this.textContent.indexOf('(');
nsR = this.textContent.indexOf(')');
eli = 0;
runaway = 0;
while ((nsR - nsL > 3) && too_big(this) && runaway++ < 500) {
if (eli !== 0) {
// elipsis already inserted
if ((eli - nsL) > (nsR - eli)) {
// cut left
start = eli - 2;
length = 2;
} else {
// cut right
start = eli + 1;
length = 1;
}
replace = '';
} else {
// replace middle with ellipsis
start = Math.floor(nsL + ((nsR - nsL) / 2));
length = 1;
replace = '…';
}
this.textContent = substr_replace(this.textContent,
replace, start, length);
eli = this.textContent.indexOf('…');
nsL = this.textContent.indexOf('(');
nsR = this.textContent.indexOf(')');
}
});
// reenable overflow
dw_qsearch.$outObj.find('li').css('overflow', 'hidden').css('text-overflow', 'ellipsis');
}
};
jQuery.extend(dw_qsearch, overrides);
if (!overrides.deferInit) {
dw_qsearch.init();
}
return dw_qsearch;
};
jQuery(function () {
jQuery('#qsearch__in').dw_qsearch({
output: '#qsearch__out'
});
});
/* XXXXXXXXXX end of lib/scripts/qsearch.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/scripts/search.js XXXXXXXXXX */
jQuery(function () {
'use strict';
const $searchForm = jQuery('.search-results-form');
if (!$searchForm.length) {
return;
}
const $toggleAssistanceButton = jQuery('
');
setButtons(true);
} else if (data.complete) {
$progressbar.progressbar('option', 'value', 100);
// redirect to start page
alert(LANG.plugins.move.complete);
window.location.href = DOKU_BASE;
} else {
// do it again
nextStep(skip);
}
}
);
};
// attach AJAX actions to buttons
$this.find('.ctl-continue').click(function (e) {
e.preventDefault();
// move in progress, no more preview
jQuery('#plugin_move__preview').remove();
// should the next error be skipped?
var skip = e.target.form.skip.value;
// step on it
nextStep(skip);
});
});
// hide preview list on namespace move
jQuery('#plugin_move__preview').each(function () {
var $this = jQuery(this);
$this.find('ul').hide();
$this.find('span')
.click(function () {
$this.find('ul').dw_toggle();
$this.find('span').toggleClass('closed');
})
.addClass('closed');
});
/**
* Script for the tree management interface
*/
var $GUI = jQuery('#plugin_move__tree');
$GUI.show();
jQuery('#plugin_move__treelink').show();
/**
* Checks if the given list item was moved in the tree
*
* Moved elements are highlighted and a title shows where they came from
*
* @param {jQuery} $li
*/
var checkForMovement = function ($li) {
// we need to check this LI and all previously moved sub LIs
var $all = $li.add($li.find('li.moved'));
$all.each(function () {
var $this = jQuery(this);
var oldid = $this.data('id');
var newid = determineNewID($this);
if (newid != oldid && !$this.hasClass('created')) {
$this.addClass('moved');
$this.children('div').attr('title', oldid + ' -> ' + newid);
} else {
$this.removeClass('moved');
$this.children('div').attr('title', '');
}
});
};
/**
* Check if the given name is allowed in the given parent
*
* @param {jQuery} $li the edited or moved LI
* @param {jQuery} $parent the (new) parent of the edited or moved LI
* @param {string} name the (new) name to check
* @returns {boolean}
*/
var checkNameAllowed = function ($li, $parent, name) {
var ok = true;
$parent.children('li').each(function () {
if (this === $li[0]) return;
var cname = 'type-f';
if ($li.hasClass('type-d')) cname = 'type-d';
var $this = jQuery(this);
if ($this.data('name') == name && $this.hasClass(cname)) ok = false;
});
return ok;
};
/**
* Returns the new ID of a given list item
*
* @param {jQuery} $li
* @returns {string}
*/
var determineNewID = function ($li) {
var myname = $li.data('name');
var $parent = $li.parent().closest('li');
if ($parent.length) {
return (determineNewID($parent) + ':' + myname).replace(/^:/, '');
} else {
return myname;
}
};
/**
* Very simplistic cleanID() in JavaScript
*
* Strips out namespaces
*
* @param {string} id
*/
var cleanID = function (id) {
if (!id) return '';
id = id.replace(/[!"#$%§&\'()+,/;<=>?@\[\]^`\{|\}~\\;:\/\*]+/g, '_');
id = id.replace(/^_+/, '');
id = id.replace(/_+$/, '');
id = id.toLowerCase();
return id;
};
/**
* Initialize the drag & drop-tree at the given li (must be this).
*/
var initTree = function () {
var $li = jQuery(this);
var my_root = $li.closest('.tree_root')[0];
$li.draggable({
revert: true,
revertDuration: 0,
opacity: 0.5,
stop : function(event, ui) {
ui.helper.css({height: "auto", width: "auto"});
}
}).droppable({
tolerance: 'pointer',
greedy: true,
accept : function(draggable) {
return my_root == draggable.closest('.tree_root')[0];
},
drop : function (event, ui) {
var $dropped = ui.draggable;
var $me = jQuery(this);
if ($dropped.children('div.li').children('input').prop('checked')) {
$dropped = $dropped.add(
jQuery(my_root)
.find('input')
.filter(function() {
return jQuery(this).prop('checked');
}).parent().parent()
);
}
if ($me.parents().addBack().is($dropped)) {
return;
}
var insert_child = !($me.hasClass("type-f") || $me.hasClass("closed"));
var $new_parent = insert_child ? $me.children('ul') : $me.parent();
var allowed = true;
$dropped.each(function () {
var $this = jQuery(this);
allowed &= checkNameAllowed($this, $new_parent, $this.data('name'));
});
if (allowed) {
if (insert_child) {
$dropped.prependTo($new_parent);
} else {
$dropped.insertAfter($me);
}
}
checkForMovement($dropped);
}
})
// add title to rename icon
.find('img.rename').attr('title', LANG.plugins.move.renameitem)
.end()
.find('img.add').attr('title', LANG.plugins.move.add);
};
var add_template = '
';
/**
* Attach event listeners to the tree
*/
$GUI.find('div.tree_root > ul.tree_list')
.click(function (e) {
var $clicky = jQuery(e.target);
var $li = $clicky.parent().parent();
if ($clicky[0].tagName == 'A' && $li.hasClass('type-d')) { // Click on folder - open and close via AJAX
e.stopPropagation();
if ($li.hasClass('open')) {
$li
.removeClass('open')
.addClass('closed');
} else {
$li
.removeClass('closed')
.addClass('open');
// if had not been loaded before, load via AJAX
if (!$li.find('ul').length) {
var is_media = $li.closest('div.tree_root').hasClass('tree_media') ? 1 : 0;
jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'plugin_move_tree',
ns: $clicky.attr('href'),
is_media: is_media
},
function (data) {
$li.append(data);
$li.find('li').each(initTree);
}
);
}
}
e.preventDefault();
} else if ($clicky[0].tagName == 'IMG') { // Click on IMG - do rename
e.stopPropagation();
var $a = $clicky.parent().find('a');
if ($clicky.hasClass('rename')) {
var newname = window.prompt(LANG.plugins.move.renameitem, $li.data('name'));
newname = cleanID(newname);
if (newname) {
if (checkNameAllowed($li, $li.parent(), newname)) {
$li.data('name', newname);
$a.text(newname);
checkForMovement($li);
} else {
alert(LANG.plugins.move.duplicate.replace('%s', newname));
}
}
} else {
var newname = window.prompt(LANG.plugins.move.add);
newname = cleanID(newname);
if (newname) {
if (checkNameAllowed($li, $li.children('ul'), newname)) {
var $new_li = jQuery(add_template.replace(/%s/g, newname));
$li.children('ul').prepend($new_li);
$new_li.each(initTree);
} else {
alert(LANG.plugins.move.duplicate.replace('%s', newname));
}
}
}
e.preventDefault();
}
}).find('li').each(initTree);
/**
* Gather all moves from the trees and put them as JSON into the form before submit
*
* @fixme has some duplicate code
*/
jQuery('#plugin_move__tree_execute').submit(function (e) {
var data = [];
$GUI.find('.tree_pages .moved').each(function (idx, el) {
var $el = jQuery(el);
var newid = determineNewID($el);
data[data.length] = {
'class': $el.hasClass('type-d') ? 'ns' : 'doc',
type: 'page',
src: $el.data('id'),
dst: newid
};
});
$GUI.find('.tree_media .moved').each(function (idx, el) {
var $el = jQuery(el);
var newid = determineNewID($el);
data[data.length] = {
'class': $el.hasClass('type-d') ? 'ns' : 'doc',
type: 'media',
src: $el.data('id'),
dst: newid
};
});
jQuery(this).find('input[name=json]').val(JSON.stringify(data));
});
/**
* Rename dialog for end users
*
* @author Andreas Gohr
*/
if(JSINFO.move_renameokay)
jQuery('.plugin_move_page')
.show()
.click(function(e) {
e.preventDefault();
var renameFN = function () {
var self = this;
var newid = $dialog.find('input[name=id]').val();
if (!newid) return false;
// remove buttons and show throbber
$dialog.html(
' '+
LANG.plugins.move.inprogress
);
$dialog.dialog('option', 'buttons', []);
// post the data
jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'plugin_move_rename',
id: JSINFO.id,
newid: newid
},
// redirect or display error
function (result) {
if(result.error){
$dialog.html(result.error.msg);
} else {
window.location.href = result.redirect_url;
}
}
);
return false;
};
// basic dialog template
var $dialog = jQuery(
'
' +
'' +
'
'
);
$dialog.find('input[name=id]').val(JSINFO.id);
$dialog.find('form').submit(renameFN);
// set up the dialog
$dialog.dialog({
title: LANG.plugins.move.rename+' '+JSINFO.id,
width: 800,
height: 180,
dialogClass: 'plugin_move_dialog',
modal: true,
buttons: [
{
text: LANG.plugins.move.cancel,
click: function () {
$dialog.dialog("close");
}
},
{
text: LANG.plugins.move.rename,
click: renameFN
}
],
// remove HTML from DOM again
close: function () {
jQuery(this).remove();
}
})
});
});
} catch (e) {
logError(e, 'lib/plugins/move/script.js');
}
/* XXXXXXXXXX end of lib/plugins/move/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/backup/script.js XXXXXXXXXX */
try {
var plugin_backup = {
timer: null,
$log: null,
start: function () {
plugin_backup.$log = jQuery('.plugin_backup .log');
plugin_backup.timer = window.setInterval(function () {
plugin_backup.$log.scrollTop(plugin_backup.$log[0].scrollHeight);
}, 100);
},
stop: function () {
if (plugin_backup.timer) {
window.clearInterval(plugin_backup.timer);
plugin_backup.timer = null;
}
jQuery('.plugin_backup .running').hide();
plugin_backup.$log.scrollTop(plugin_backup.$log[0].scrollHeight);
}
};
} catch (e) {
logError(e, 'lib/plugins/backup/script.js');
}
/* XXXXXXXXXX end of lib/plugins/backup/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/awtools/script.js XXXXXXXXXX */
try {
// lightbox_plus.js
// == written by Takuya Otani ===
// == Copyright (C) 2006 SimpleBoxes/SerendipityNZ Ltd. ==
/*
Copyright (C) 2006 Takuya Otani/SimpleBoxes - http://serennz.cool.ne.jp/sb/
Copyright (C) 2006 SerendipityNZ - http://serennz.cool.ne.jp/snz/
This script is licensed under the Creative Commons Attribution 2.5 License
http://creativecommons.org/licenses/by/2.5/
basically, do anything you want, just leave my name and link.
*/
/*
Original script : Lightbox JS : Fullsize Image Overlays
Copyright (C) 2005 Lokesh Dhakar - http://www.huddletogether.com
For more information on this script, visit:
http://huddletogether.com/projects/lightbox/
*/
// ver. 20180730 - MW: transparentstyle, effect+loading? dropped
// ver. 20140824 - fixed several bugs (syntax errors, next image button position issue)
// ver. 20100823 - fixed a bug ( some captions could be shown on out side of screen )
// ver. 20100821 - fixed a bug ( missing action buttons in some occasions )
// ver. 20090729 - fixed a bug ( lightbox may not be closed properly )
// ver. 20090709 - fixed a bug ( loading image is not shown properly )
// ver. 20090707 - implemented animation feature
// ver. 20090318 - fixed a bug ( prev/next are not shown in some occasions )
// ver. 20061027 - fixed a bug ( not work at xhtml documents on Netscape7 )
// ver. 20061026 - fixed bugs
// ver. 20061010 - implemented image set feature
// ver. 20060921 - fixed a bug / added overall view
// ver. 20060920 - added flag to prevent mouse wheel event
// ver. 20060919 - fixed a bug
// ver. 20060918 - implemented functionality of wheel zoom & drag'n drop
// ver. 20060131 - fixed a bug to work correctly on Internet Explorer for Windows
// ver. 20060128 - implemented functionality of echoic word
// ver. 20060120 - implemented functionality of caption and close button
// === elements ===
document.getElemetsByClassName = function(name,target)
{
var result = [];
var object = null;
var search = new RegExp(['(^|\\s)',name,'(\\s|$)'].join(''));
if (target && target.getElementsByTagName)
object = target.getElementsByTagName('*');
if (!object)
object = document.getElementsByTagName ? document.getElementsByTagName('*') : document.all;
for (var i=0,n=object.length;i d.body.offsetWidth) ? d.body.scrollWidth
: d.body.offsetWidth;
var h =
(window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY
: (d.body.scrollHeight > d.body.offsetHeight) ? d.body.scrollHeight
: d.body.offsetHeight;
var updated = this.win.update();
if (w < this.win.w) w = this.win.w;
if (h < this.win.h) h = this.win.h;
if (updated || w != this.w || h != this.h)
{
this.w = w;
this.h = h;
return true;
}
return false;
};
function PagePos()
{ // page position object
this.x = 0;
this.y = 0;
return this;
}
PagePos.prototype.update = function()
{
var d = document;
var x =
(window.pageXOffset) ? window.pageXOffset
: (d.documentElement && d.documentElement.scrollLeft) ? d.documentElement.scrollLeft
: (d.body) ? d.body.scrollLeft
: 0;
var y =
(window.pageYOffset) ? window.pageYOffset
: (d.documentElement && d.documentElement.scrollTop) ? d.documentElement.scrollTop
: (d.body) ? d.body.scrollTop
: 0;
if (x != this.x || y != this.y)
{
this.x = x;
this.y = y;
return true;
}
return false;
};
// === browser ===
if ( !window.Spica )
{
var Spica = {};
Spica.Browser = function()
{
this.name = navigator.userAgent;
this.isWinIE = this.isMacIE = false;
this.isGecko = this.name.match(/Gecko\//);
this.isSafari = this.name.match(/AppleWebKit/);
this.isSafari3 = (this.name.match(/AppleWebKit\/(\d\d\d)/) && parseInt(RegExp.$1) > 500);
this.isKHTML = this.isSafari || navigator.appVersion.match(/Konqueror|KHTML/);
this.isOpera = window.opera;
if (document.all && !this.isGecko && !this.isSafari && !this.isOpera)
{
this.isWinIE = this.name.match(/Win/);
this.isMacIE = this.name.match(/Mac/);
this.isNewIE = (this.name.match(/MSIE (\d\.\d)/) && RegExp.$1 > 6.5);
}
};
Spica.Event = {
cache : false,
getEvent : function(evnt)
{
return (evnt) ? evnt : ((window.event) ? window.event : null);
},
getKey : function(evnt)
{
if (!evnt) return; // do nothing
return (evnt.keyCode) ? evnt.keyCode : evnt.charCode;
},
stop : function(evnt)
{
if (!evnt) return; // do nothing
try
{
evnt.stopPropagation();
}
catch(err) {}
evnt.cancelBubble = true;
try
{
evnt.preventDefault();
}
catch(err) {}
return (evnt.returnValue = false);
},
register : function(object, type, handler)
{
if (!object) return;
if (type == 'keypress' && !object.addEventListener) type = 'keydown';
if (type == 'mousewheel' && Spica.Browser.isGecko) type = 'DOMMouseScroll';
if (!this.cache) this.cache = [];
if (object.addEventListener)
{
this.cache.push([object,type,handler]);
object.addEventListener(type, handler, false);
}
else if (object.attachEvent)
{
this.cache.push([object,type,handler]);
object.attachEvent('on' + type,handler);
}
else
{
object['on' + type] = handler;
}
},
deregister : function(object, type, handler)
{
if (!object) return;
if (type == 'keypress' && !object.addEventListener) type = 'keydown';
if (type == 'mousewheel' && Spica.Browser.isGecko) type = 'DOMMouseScroll';
if (object.removeEventListener)
object.removeEventListener(type, handler, false);
else if (object.detachEvent)
object.detachEvent('on' + type, handler);
else
object['on' + type] = null;
},
deregisterAll : function()
{
if (!Spica.Event.cache) return;
for (var i=0,n=Spica.Event.cache.length;i
*/
// http://localhost/lib/exe/fetch.php?cache=&media=de:parts:fake_mc68000rc75_c4_0125_00e31f.jpg
if (anchor.getAttribute("title"))
self._imgs[num].title = anchor.getAttribute("title");
else if ( anchor.firstChild
&& anchor.firstChild.getAttribute
&& anchor.firstChild.getAttribute("title"))
self._imgs[num].title = anchor.firstChild.getAttribute("title");
anchor.onclick = self._genOpener(num); // set closure to onclick event
if (rel != 'noopen')
{
if (!self._sets[rel]) self._sets[rel] = [];
self._sets[rel].push(num);
}
}
},
_genOpener : function(num)
{
var self = this;
return function() { self._show(num); return false; };
},
_createWrapOn : function(obj)
{
var self = this;
if (!obj) return null;
// create wrapper object, translucent background
var wrap = document.createElement('div');
obj.appendChild(wrap);
wrap.id = 'overlay';
wrap.style.display = 'none';
wrap.style.position = 'fixed';
wrap.style.top = '0px';
wrap.style.left = '0px';
wrap.style.zIndex = '50';
wrap.style.width = '100%';
wrap.style.height = '100%';
if (Spica.Browser.isWinIE) wrap.style.position = 'absolute';
Spica.Event.register(wrap,"click",function(evt) { self._close(evt); });
return wrap;
},
_createBoxOn : function(obj,option)
{
var self = this;
if (!obj) return null;
// create lightbox object, frame rectangle
var box = document.createElement('div');
obj.appendChild(box);
box.id = 'lightbox';
box.style.display = 'none';
box.style.position = 'absolute';
box.style.zIndex = '60';
// create image object to display a target image
var img = document.createElement('img');
box.appendChild(img);
img.id = 'lightboxImage';
img.width = 200;
img.height = 200;
self._set_cursor(img);
Spica.Event.register(img,'mouseover',function() { self._actionEnabled = true; self._show_action(); });
Spica.Event.register(img,'mouseout',function() { self._actionEnabled = false; self._hide_action(); });
Spica.Event.register(img,'click',function(evt) { self._close(evt); });
// create loading image, animated image
// killed
// create hover navi - prev
if (option.previmg)
{
var prevLink = document.createElement('div');
box.appendChild(prevLink);
prevLink.id = 'prevLink';
prevLink.style.display = 'none';
prevLink.style.left = '-20px';
var prevLink2 = document.createElement('img');
prevLink.appendChild(prevLink2);
prevLink2.id = 'prevLink2';
prevLink2.style.left = '0px';
prevLink2.src = option.previmg;
self._prev = prevLink;
self._prev2 = prevLink2;
Spica.Event.register(prevLink,'mouseover',function() { self._actionEnabled = true; self._show_action(); });
Spica.Event.register(prevLink,'click',function() { self._show_next(-1); });
}
// create hover navi - next
if (option.nextimg)
{
var nextLink = document.createElement('img');
box.appendChild(nextLink);
nextLink.id = 'nextLink';
nextLink.style.display = 'none';
nextLink.style.right = '-20px';
var nextLink2 = document.createElement('img');
nextLink.appendChild(nextLink2);
nextLink2.id = 'prevLink2';
nextLink2.style.right = '0px';
nextLink2.src = option.nextimg;
self._next = nextLink;
self._next2 = nextLink2;
Spica.Event.register(nextLink,'mouseover',function() { self._actionEnabled = true; self._show_action(); });
Spica.Event.register(nextLink,'click',function() { self._show_next(+1); });
}
// create zoom indicator - Zoom-Symbol
var zoom = document.createElement('img');
box.appendChild(zoom);
zoom.id = 'actionImage';
zoom.style.display = 'none';
zoom.style.position = 'absolute';
zoom.style.top = '150px';
zoom.style.left = '150px';
zoom.style.zIndex = '70';
self._set_cursor(zoom);
zoom.src = self._expand;
Spica.Event.register(zoom,'mouseover',function() { self._actionEnabled = true; self._show_action(); });
Spica.Event.register(zoom,'click', function() { self._zoom(); });
// create close button
if (option.closeimg)
{
var btn = document.createElement('img');
box.appendChild(btn);
btn.id = 'closeButton';
btn.style.display = 'inline';
btn.style.position = 'absolute';
btn.style.right = '9px';
btn.style.top = '10px';
btn.style.zIndex = '80';
btn.src = option.closeimg;
self._set_cursor(btn);
Spica.Event.register(btn,'click',function(evt) { self._close(evt); });
}
// caption text
var caption = document.createElement('span');
box.appendChild(caption);
caption.id = 'lightboxCaption';
caption.style.display = 'none';
caption.style.position = 'absolute';
caption.style.zIndex = '80';
if (self._resizable)
{
var overall = document.createElement('div');
obj.appendChild(overall);
overall.id = 'lightboxOverallView';
overall.style.display = 'none';
overall.style.position = 'absolute';
overall.style.zIndex = '70';
self._overall = overall;
var indicator = document.createElement('div');
obj.appendChild(indicator);
indicator.id = 'lightboxIndicator';
indicator.style.display = 'none';
indicator.style.position = 'absolute';
indicator.style.zIndex = '80';
self._indicator = indicator;
}
return box;
},
_set_photo_size : function()
{
var self = this;
if (self._open == -1) return;
var heightmargin = 30;
var caption = document.getElementById('lightboxCaption');
if (caption)
heightmargin += caption.clientHeight || caption.offsetHeight;
var targ = { w:self._page.win.w - 30, h:self._page.win.h - heightmargin };
var zoom = { x:20, y:20 };
// links rechts buttons an den Rand
var navi = { p:0, n:0, y:0 };
if (!self._expanded)
{ // shrink image with the same aspect
var orig = { w:self._imgs[self._open].w, h:self._imgs[self._open].h };
if ( orig.w < 0 ) orig.w = self._img.width;
if ( orig.h < 0 ) orig.h = self._img.height;
var ratio = 1.0;
if ((orig.w >= targ.w || orig.h >= targ.h) && orig.h && orig.w)
ratio = ((targ.w / orig.w) < (targ.h / orig.h)) ? targ.w / orig.w : targ.h / orig.h;
self._expandable = (ratio < 1.0);
self._anim.w = Math.floor(orig.w * ratio);
self._anim.h = Math.floor(orig.h * ratio);
if (self._resizable) self._expandable = true;
if (Spica.Browser.isWinIE) self._box.style.display = "block";
// plus 4px Distance zu top und left
self._imgpos.x = self._pos.x + 4+ (targ.w - self._img.width) / 2;
self._imgpos.y = self._pos.y + 4+ (targ.h - self._img.height) / 2;
navi.y = Math.floor(self._img.height / 2) - 10;
self._show_overall(false);
if (caption)
{
caption.style.top = [self._img.height + 10,'px'].join(''); // 10 is top margin of lightbox
caption.style.width = [self._img.width + 0,'px'].join(''); // normal 20 is total side margin of lightbox
}
}
else
{ // zoomed or actual sized image
var width = parseInt(self._imgs[self._open].w * self._level);
var height = parseInt(self._imgs[self._open].h * self._level);
self._minpos.x = self._pos.x + targ.w - self._img.width;
self._minpos.y = self._pos.y + targ.h - self._img.height;
if (self._img.width <= targ.w)
self._imgpos.x = self._pos.x + (targ.w - self._img.width) / 2;
else
{
if (self._imgpos.x > self._pos.x) self._imgpos.x = self._pos.x;
else if (self._imgpos.x < self._minpos.x) self._imgpos.x = self._minpos.x;
zoom.x = 15 + self._pos.x - self._imgpos.x;
navi.p = self._pos.x - self._imgpos.x - 5;
navi.n = self._img.width - self._page.win.w + self._imgpos.x + 20 - self._pos.x;
if (Spica.Browser.isWinIE) navi.n -= 10;
}
if (self._img.height <= targ.h)
{
self._imgpos.y = self._pos.y + (targ.h - self._img.height) / 2;
navi.y = Math.floor(self._img.height / 2) - 10;
}
else
{
if (self._imgpos.y > self._pos.y) self._imgpos.y = self._pos.y;
else if (self._imgpos.y < self._minpos.y) self._imgpos.y = self._minpos.y;
zoom.y = 15 + self._pos.y - self._imgpos.y;
navi.y = Math.floor(targ.h / 2) - 10 + self._pos.y - self._imgpos.y;
}
self._anim.w = width;
self._anim.h = height;
self._show_overall(true);
}
self._box.style.left = [self._imgpos.x,'px'].join('');
self._box.style.top = [self._imgpos.y,'px'].join('');
self._zoomimg.style.left = [zoom.x,'px'].join('');
self._zoomimg.style.top = [zoom.y,'px'].join('');
self._wrap.style.left = self._pos.x;
if (self._prev && self._next)
{
self._prev2.style.left = [navi.p,'px'].join('');
self._next2.style.right = [navi.n,'px'].join('');
self._prev2.style.top = self._next2.style.top = [navi.y,'px'].join('');
}
self._changed = true;
},
_show_overall : function(visible)
{
var self = this;
if (self._overall === null) return;
if (visible)
{
if (self._open == -1) return;
var base = 100;
var outer = { w:0, h:0, x:0, y:0 };
var inner = { w:0, h:0, x:0, y:0 };
var orig = { w:self._img.width , h:self._img.height };
var targ = { w:self._page.win.w - 30, h:self._page.win.h - 30 };
var max = orig.w;
if (max < orig.h) max = orig.h;
if (max < targ.w) max = targ.w;
if (max < targ.h) max = targ.h;
if (max < 1) return;
outer.w = parseInt(orig.w / max * base);
outer.h = parseInt(orig.h / max * base);
inner.w = parseInt(targ.w / max * base);
inner.h = parseInt(targ.h / max * base);
outer.x = self._pos.x + targ.w - base - 20;
outer.y = self._pos.y + targ.h - base - 20;
inner.x = outer.x - parseInt((self._imgpos.x - self._pos.x) / max * base);
inner.y = outer.y - parseInt((self._imgpos.y - self._pos.y) / max * base);
self._overall.style.left = [outer.x,'px'].join('');
self._overall.style.top = [outer.y,'px'].join('');
self._overall.style.width = [outer.w,'px'].join('');
self._overall.style.height = [outer.h,'px'].join('');
self._indicator.style.left = [inner.x,'px'].join('');
self._indicator.style.top = [inner.y,'px'].join('');
self._indicator.style.width = [inner.w,'px'].join('');
self._indicator.style.height = [inner.h,'px'].join('');
self._overall.style.display = 'block';
self._indicator.style.display = 'block';
}
else
{
self._overall.style.display = 'none';
self._indicator.style.display = 'none';
}
},
_set_size : function(onResize)
{
var self = this;
if (self._open == -1) return;
if (!self._page.update() && !self._pos.update() && !self._changed) return;
if (Spica.Browser.isWinIE)
{
self._wrap.style.width = [self._page.win.w,'px'].join('');
self._wrap.style.height = [self._page.win.h,'px'].join('');
self._wrap.style.top = [self._pos.y,'px'].join('');
}
if (onResize) self._set_photo_size();
},
_set_cursor : function(obj)
{
if (Spica.Browser.isWinIE && !Spica.Browser.isNewIE) return;
obj.style.cursor = 'pointer';
},
_current_setindex : function()
{
var self = this;
if (!self._openedset) return -1;
var list = self._sets[self._openedset];
for (var i=0,n=list.length;i -1)
{
if (check > 0) self._prev.style.display = 'inline';
if (check < self._get_setlength() - 1) self._next.style.display = 'inline';
}
if (!self._expandable || !self._zoomimg) return;
self._zoomimg.src = (self._expanded) ? self._shrink : self._expand;
self._zoomimg.style.display = 'inline';
},
_hide_action : function()
{
var self = this;
if (self._zoomimg) self._zoomimg.style.display = 'none';
if (self._open > -1 && self._expanded) self._dragstop(null);
if (self._prev) self._prev.style.display = 'none';
if (self._next) self._next.style.display = 'none';
},
_zoom : function()
{
var self = this;
var closeBtn = document.getElementById('closeButton');
if (self._expanded)
{
self._reset_func();
self._expanded = false;
if (closeBtn) closeBtn.style.display = 'inline';
}
else if (self._open > -1)
{
self._level = 1;
self._imgpos.x = self._pos.x;
self._imgpos.y = self._pos.y;
self._expanded = true;
self._funcs.drag = function(evt) { self._dragstart(evt); };
self._funcs.dbl = function() { self._close(null); };
if (self._resizable)
{
self._funcs.wheel = function(evt) { self._onwheel(evt); };
Spica.Event.register(self._box,'mousewheel',self._funcs.wheel);
}
Spica.Event.register(self._img,'mousedown',self._funcs.drag);
Spica.Event.register(self._img,'dblclick',self._funcs.dbl);
self._show_caption(false);
if (closeBtn) closeBtn.style.display = 'none';
}
self._set_photo_size();
self._show_action();
},
_reset_func : function()
{
var self = this;
if (self._funcs.wheel !== null) Spica.Event.deregister(self._box,'mousewheel',self._funcs.wheel);
if (self._funcs.move !== null) Spica.Event.deregister(self._img,'mousemove',self._funcs.move);
if (self._funcs.up !== null) Spica.Event.deregister(self._img,'mouseup',self._funcs.up);
if (self._funcs.drag !== null) Spica.Event.deregister(self._img,'mousedown',self._funcs.drag);
if (self._funcs.dbl !== null) Spica.Event.deregister(self._img,'dblclick',self._funcs.dbl);
self._funcs = {'move':null,'up':null,'drag':null,'wheel':null,'dbl':null};
},
_onwheel : function(evt)
{
var self = this;
var delta = 0;
evt = Spica.Event.getEvent(evt);
if (evt.wheelDelta) delta = event.wheelDelta/-120;
else if (evt.detail) delta = evt.detail/3;
if (Spica.Browser.isOpera) delta = - delta;
var step =
(self._level < 1) ? 0.1
: (self._level < 2) ? 0.25
: (self._level < 4) ? 0.5
: 1;
self._level = (delta > 0) ? self._level + step : self._level - step;
if (self._level > 8) self._level = 8;
else if (self._level < 0.5) self._level = 0.5;
self._set_photo_size();
return Spica.Event.stop(evt);
},
_dragstart : function(evt)
{
var self = this;
evt = Spica.Event.getEvent(evt);
self._curpos.x = evt.screenX;
self._curpos.y = evt.screenY;
self._funcs.move = function(evnt) { self._dragging(evnt); };
self._funcs.up = function(evnt) { self._dragstop(evnt); };
Spica.Event.register(self._img,'mousemove',self._funcs.move);
Spica.Event.register(self._img,'mouseup',self._funcs.up);
return Spica.Event.stop(evt);
},
_dragging : function(evt)
{
var self = this;
evt = Spica.Event.getEvent(evt);
self._imgpos.x += evt.screenX - self._curpos.x;
self._imgpos.y += evt.screenY - self._curpos.y;
self._curpos.x = evt.screenX;
self._curpos.y = evt.screenY;
self._set_photo_size();
return Spica.Event.stop(evt);
},
_dragstop : function(evt)
{
var self = this;
evt = Spica.Event.getEvent(evt);
if (self._funcs.move !== null) Spica.Event.deregister(self._img,'mousemove',self._funcs.move);
if (self._funcs.up !== null) Spica.Event.deregister(self._img,'mouseup',self._funcs.up);
self._funcs.move = null;
self._funcs.up = null;
self._set_photo_size();
return (evt) ? Spica.Event.stop(evt) : false;
},
_show_caption : function(enable,initializing)
{
var self = this;
var caption = document.getElementById('lightboxCaption');
if (!caption) return;
if (caption.innerHTML.length === 0 || !enable)
{
caption.style.display = 'none';
}
else
{ // now display caption
caption.style.top = [self._img.height + 10,'px'].join(''); // 10 is top margin of lightbox
caption.style.left = '0px';
caption.style.width = [self._img.width + 0,'px'].join(''); // normal 20 is total side margin of lightbox
caption.style.display = 'block';
self._setOpacity(caption, initializing ? 0 : 10);
}
},
_toggle_wrap : function(flag)
{
var self = this;
self._wrap.style.display = flag ? "block" : "none";
var i,n;
if (self._hiding.length === 0 && !self._first)
{ // some objects may overlap on overlay, so we hide them temporarily.
var tags = ['select','embed','object'];
for (i=0,n=tags.length;i= self._imgs.length) return;
self._open = num; // set opened image number
self._prepare();
self._set_photo_size();
imag.onload = function() {
self._expanded = false;
if (self._imgs[self._open].w == -1)
{ // store original image width and height
self._imgs[self._open].w = imag.width;
self._imgs[self._open].h = imag.height;
}
var caption = document.getElementById('lightboxCaption');
if (caption)
{
try { caption.innerHTML = self._imgs[self._open].title; } catch(e) {}
self._show_caption(true,true);
}
self._anim.t = (new Date()).getTime();
self._anim.s = self._anim.t;
self._timer = window.setInterval( function() { self._run(); }, 20);
self._img.setAttribute('title',self._imgs[self._open].title);
self._anim.step = ( self._anim.f ) ? 0 : 2;
self._set_photo_size(); // calc and set lightbox size
if ( !self._anim.f ) // animator is disabled, so apply immediately
self._show_image();
if (self._imgs[self._open].set != 'noopen')
{
var set = self._imgs[self._open].set;
if (self._sets[set].length > 1) self._openedset = set;
if (!self._prev || !self._next) self._openedset = null;
}
};
self._expandable = false;
self._expanded = false;
self._anim.step = -1;
imag.src = self._imgs[self._open].src;
},
_run : function()
{
var self = this;
var t = (new Date()).getTime();
if ( t - self._anim.t < 50 ) return;
self._anim.t = t;
self._set_size(true);
if ( self._anim.step === 0 || self._anim.w != self._img.width || self._anim.h != self._img.height )
{
self._doResizing();
}
if ( self._anim.step === 1 )
{
self._doFadeIn();
}
else if ( self._anim.step === 3 )
{
self._doFadeOut();
}
},
_show_image : function()
{
var self = this;
if (self._open == -1) return;
self._img.src = self._imgs[self._open].src;
var closeBtn = document.getElementById('closeButton');
if (closeBtn) closeBtn.style.display = 'inline';
self._show_caption(true);
if (self._actionEnabled) self._show_action();
},
_isAnimationExpired : function()
{
return ((new Date()).getTime() - this._anim.s > 1000);
},
_doResizing : function()
{
var self = this;
var diff = {
x: ( self._anim.f ) ? Math.floor((self._anim.w - self._img.width) / 3) : 0,
y: ( self._anim.f ) ? Math.floor((self._anim.h - self._img.height) / 3) : 0
};
self._img.width += diff.x;
self._img.height += diff.y;
if ( Math.abs(diff.x) < 1 ) self._img.width = self._anim.w;
if ( Math.abs(diff.y) < 1 ) self._img.height = self._anim.h;
var done = ( self._anim.w == self._img.width && self._anim.h == self._img.height );
if (done || self._isAnimationExpired())
{
self._changed = false;
self._set_photo_size();
if ( self._anim.step === 0 )
{
self._anim.step = 1; // move on the next stage
self._anim.a = 0;
self._anim.s = (new Date()).getTime();
self._show_image();
self._setOpacity(self._img,self._anim.a);
}
}
else if (self._anim.step == 2 && !self._expanded)
self._show_caption(true);
},
_doFadeIn : function()
{
var self = this;
self._anim.a += 2;
if ( self._anim.a > 10 )
{
self._anim.step = 2; // finish
self._anim.a = 9.9;
}
self._setOpacity(self._img,self._anim.a);
},
_doFadeOut : function()
{
var self = this;
self._anim.a -= 1;
if ( self._anim.a < 1 )
{
self._anim.step = 2; // finish
self._anim.a = 0;
if ( self._timer !== null )
{
window.clearInterval(self._timer);
self._timer = null;
}
self._toggle_wrap(false);
}
self._setOpacity(self._wrap,self._anim.a);
},
_setOpacity : function(elem, alpha)
{
if (Spica.Browser.isWinIE)
elem.style.filter = 'alpha(opacity=' + (alpha * 10) + ')';
else
elem.style.opacity = alpha / 10;
},
_close_box : function()
{
var self = this;
self._open = -1;
self._openedset = null;
self._hide_action();
self._reset_func();
self._show_overall(false);
self._box.style.display = "none";
if ( !self._anim.f && self._timer !== null )
{
window.clearInterval(self._timer);
self._timer = null;
}
},
_show_next : function(direction)
{
var self = this;
if (!self._openedset) return self._close(null);
var index = self._current_setindex() + direction;
var targ = self._sets[self._openedset][index];
self._close_box();
self._show(targ);
},
_close : function(evt)
{
var self = this;
if (evt !== null)
{
evt = Spica.Event.getEvent(evt);
var targ = evt.target || evt.srcElement;
if (targ && targ.getAttribute('id') == 'lightboxImage' && self._expanded) return;
}
self._close_box();
if ( self._anim.f && self._anim.step == 2 )
{
self._anim.step = 3;
self._anim.a = 5;
}
else
{
self._toggle_wrap(false);
}
}
};
Spica.Event.run(function() {
new Lightbox({
expandimg:'/lib/plugins/awtools/pic/expand.gif',
shrinkimg:'/lib/plugins/awtools/pic/shrink.gif',
blankimg:'/lib/plugins/awtools/pic/blank.gif',
previmg:'/lib/plugins/awtools/pic/prevtr4.gif',
nextimg:'/lib/plugins/awtools/pic/nexttr2.gif',
closeimg:'/lib/plugins/awtools/pic/close.gif',
resizable:true,
animation:false
});
});
} catch (e) {
logError(e, 'lib/plugins/awtools/script.js');
}
/* XXXXXXXXXX end of lib/plugins/awtools/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/styling/script.js XXXXXXXXXX */
try {
/*! Iris Color Picker - v1.0.7 - 2014-11-28
* https://github.com/Automattic/Iris
* Copyright (c) 2014 Matt Wiebe; Licensed GPLv2 */
(function( $, undef ){
var _html, nonGradientIE, gradientType, vendorPrefixes, _css, Iris, UA, isIE, IEVersion;
_html = '
';
_css = '.iris-picker{display:block;position:relative}.iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input+.iris-picker{margin-top:4px}.iris-error{background-color:#ffafaf}.iris-border{border-radius:3px;border:1px solid #aaa;width:200px;background-color:#fff}.iris-picker-inner{position:absolute;top:0;right:0;left:0;bottom:0}.iris-border .iris-picker-inner{top:10px;right:10px;left:10px;bottom:10px}.iris-picker .iris-square-inner{position:absolute;left:0;right:0;top:0;bottom:0}.iris-picker .iris-square,.iris-picker .iris-slider,.iris-picker .iris-square-inner,.iris-picker .iris-palette{border-radius:3px;box-shadow:inset 0 0 5px rgba(0,0,0,.4);height:100%;width:12.5%;float:left;margin-right:5%}.iris-picker .iris-square{width:76%;margin-right:10%;position:relative}.iris-picker .iris-square-inner{width:auto;margin:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-square-inner,.iris-ie-9 .iris-palette{box-shadow:none;border-radius:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-palette{outline:1px solid rgba(0,0,0,.1)}.iris-ie-lt9 .iris-square,.iris-ie-lt9 .iris-slider,.iris-ie-lt9 .iris-square-inner,.iris-ie-lt9 .iris-palette{outline:1px solid #aaa}.iris-ie-lt9 .iris-square .ui-slider-handle{outline:1px solid #aaa;background-color:#fff;-ms-filter:"alpha(Opacity=30)"}.iris-ie-lt9 .iris-square .iris-square-handle{background:0;border:3px solid #fff;-ms-filter:"alpha(Opacity=50)"}.iris-picker .iris-strip{margin-right:0;position:relative}.iris-picker .iris-strip .ui-slider-handle{position:absolute;background:0;margin:0;right:-3px;left:-3px;border:4px solid #aaa;border-width:4px 3px;width:auto;height:6px;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);opacity:.9;z-index:5;cursor:ns-resize}.iris-strip .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.iris-picker .iris-slider-offset{position:absolute;top:11px;left:0;right:0;bottom:-3px;width:auto;height:auto;background:transparent;border:0;border-radius:0}.iris-picker .iris-square-handle{background:transparent;border:5px solid #aaa;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.iris-picker .iris-square-handle:hover{border-color:#999}.iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.iris-picker .iris-square-handle:hover::after{border-color:#fff}.iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.iris-picker .iris-square-value{width:8px;height:8px;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.iris-palette-container{position:absolute;bottom:0;left:0;margin:0;padding:0}.iris-border .iris-palette-container{left:10px;bottom:10px}.iris-picker .iris-palette{margin:0;cursor:pointer}.iris-square-handle,.ui-slider-handle{border:0;outline:0}';
// Even IE9 dosen't support gradients. Elaborate sigh.
UA = navigator.userAgent.toLowerCase();
isIE = navigator.appName === 'Microsoft Internet Explorer';
IEVersion = isIE ? parseFloat( UA.match( /msie ([0-9]{1,}[\.0-9]{0,})/ )[1] ) : 0;
nonGradientIE = ( isIE && IEVersion < 10 );
gradientType = false;
// we don't bother with an unprefixed version, as it has a different syntax
vendorPrefixes = [ '-moz-', '-webkit-', '-o-', '-ms-' ];
// Bail for IE <= 7
if ( nonGradientIE && IEVersion <= 7 ) {
$.fn.iris = $.noop;
$.support.iris = false;
return;
}
$.support.iris = true;
function testGradientType() {
var el, base,
bgImageString = 'backgroundImage';
if ( nonGradientIE ) {
gradientType = 'filter';
}
else {
el = $( '' );
base = 'linear-gradient(top,#fff,#000)';
$.each( vendorPrefixes, function( i, val ){
el.css( bgImageString, val + base );
if ( el.css( bgImageString ).match( 'gradient' ) ) {
gradientType = i;
return false;
}
});
// check for legacy webkit gradient syntax
if ( gradientType === false ) {
el.css( 'background', '-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))' );
if ( el.css( bgImageString ).match( 'gradient' ) ) {
gradientType = 'webkit';
}
}
el.remove();
}
}
/**
* Only for CSS3 gradients. oldIE will use a separate function.
*
* Accepts as many color stops as necessary from 2nd arg on, or 2nd
* arg can be an array of color stops
*
* @param {string} origin Gradient origin - top or left, defaults to left.
* @return {string} Appropriate CSS3 gradient string for use in
*/
function createGradient( origin, stops ) {
origin = ( origin === 'top' ) ? 'top' : 'left';
stops = $.isArray( stops ) ? stops : Array.prototype.slice.call( arguments, 1 );
if ( gradientType === 'webkit' ) {
return legacyWebkitGradient( origin, stops );
} else {
return vendorPrefixes[ gradientType ] + 'linear-gradient(' + origin + ', ' + stops.join(', ') + ')';
}
}
/**
* Stupid gradients for a stupid browser.
*/
function stupidIEGradient( origin, stops ) {
var type, self, lastIndex, filter, startPosProp, endPosProp, dimensionProp, template, html;
origin = ( origin === 'top' ) ? 'top' : 'left';
stops = $.isArray( stops ) ? stops : Array.prototype.slice.call( arguments, 1 );
// 8 hex: AARRGGBB
// GradientType: 0 vertical, 1 horizontal
type = ( origin === 'top' ) ? 0 : 1;
self = $( this );
lastIndex = stops.length - 1;
filter = 'filter';
startPosProp = ( type === 1 ) ? 'left' : 'top';
endPosProp = ( type === 1 ) ? 'right' : 'bottom';
dimensionProp = ( type === 1 ) ? 'height' : 'width';
template = '';
html = '';
// need a positioning context
if ( self.css('position') === 'static' ) {
self.css( {position: 'relative' } );
}
stops = fillColorStops( stops );
$.each(stops, function( i, startColor ) {
var endColor, endStop, filterVal;
// we want two at a time. if we're on the last pair, bail.
if ( i === lastIndex ) {
return false;
}
endColor = stops[ i + 1 ];
//if our pairs are at the same color stop, moving along.
if ( startColor.stop === endColor.stop ) {
return;
}
endStop = 100 - parseFloat( endColor.stop ) + '%';
startColor.octoHex = new Color( startColor.color ).toIEOctoHex();
endColor.octoHex = new Color( endColor.color ).toIEOctoHex();
filterVal = 'progid:DXImageTransform.Microsoft.Gradient(GradientType=' + type + ', StartColorStr=\'' + startColor.octoHex + '\', EndColorStr=\'' + endColor.octoHex + '\')';
html += template.replace( '%start%', startColor.stop ).replace( '%end%', endStop ).replace( '%filter%', filterVal );
});
self.find( '.iris-ie-gradient-shim' ).remove();
$( html ).prependTo( self );
}
function legacyWebkitGradient( origin, colorList ) {
var stops = [];
origin = ( origin === 'top' ) ? '0% 0%,0% 100%,' : '0% 100%,100% 100%,';
colorList = fillColorStops( colorList );
$.each( colorList, function( i, val ){
stops.push( 'color-stop(' + ( parseFloat( val.stop ) / 100 ) + ', ' + val.color + ')' );
});
return '-webkit-gradient(linear,' + origin + stops.join(',') + ')';
}
function fillColorStops( colorList ) {
var colors = [],
percs = [],
newColorList = [],
lastIndex = colorList.length - 1;
$.each( colorList, function( index, val ) {
var color = val,
perc = false,
match = val.match( /1?[0-9]{1,2}%$/ );
if ( match ) {
color = val.replace( /\s?1?[0-9]{1,2}%$/, '' );
perc = match.shift();
}
colors.push( color );
percs.push( perc );
});
// back fill first and last
if ( percs[0] === false ) {
percs[0] = '0%';
}
if ( percs[lastIndex] === false ) {
percs[lastIndex] = '100%';
}
percs = backFillColorStops( percs );
$.each( percs, function( i ){
newColorList[i] = { color: colors[i], stop: percs[i] };
});
return newColorList;
}
function backFillColorStops( stops ) {
var first = 0,
last = stops.length - 1,
i = 0,
foundFirst = false,
incr,
steps,
step,
firstVal;
if ( stops.length <= 2 || $.inArray( false, stops ) < 0 ) {
return stops;
}
while ( i < stops.length - 1 ) {
if ( ! foundFirst && stops[i] === false ) {
first = i - 1;
foundFirst = true;
} else if ( foundFirst && stops[i] !== false ) {
last = i;
i = stops.length;
}
i++;
}
steps = last - first;
firstVal = parseInt( stops[first].replace('%'), 10 );
incr = ( parseFloat( stops[last].replace('%') ) - firstVal ) / steps;
i = first + 1;
step = 1;
while ( i < last ) {
stops[i] = ( firstVal + ( step * incr ) ) + '%';
step++;
i++;
}
return backFillColorStops( stops );
}
$.fn.gradient = function() {
var args = arguments;
return this.each( function() {
// this'll be oldishIE
if ( nonGradientIE ) {
stupidIEGradient.apply( this, args );
} else {
// new hotness
$( this ).css( 'backgroundImage', createGradient.apply( this, args ) );
}
});
};
$.fn.raninbowGradient = function( origin, args ) {
var opts, template, i, steps;
origin = origin || 'top';
opts = $.extend( {}, { s: 100, l: 50 }, args );
template = 'hsl(%h%,' + opts.s + '%,' + opts.l + '%)';
i = 0;
steps = [];
while ( i <= 360 ) {
steps.push( template.replace('%h%', i) );
i += 30;
}
return this.each(function() {
$(this).gradient( origin, steps );
});
};
// the colorpicker widget def.
Iris = {
options: {
color: false,
mode: 'hsl',
controls: {
horiz: 's', // horizontal defaults to saturation
vert: 'l', // vertical defaults to lightness
strip: 'h' // right strip defaults to hue
},
hide: true, // hide the color picker by default
border: true, // draw a border around the collection of UI elements
target: false, // a DOM element / jQuery selector that the element will be appended within. Only used when called on an input.
width: 200, // the width of the collection of UI elements
palettes: false // show a palette of basic colors beneath the square.
},
_color: '',
_palettes: [ '#000', '#fff', '#d33', '#d93', '#ee2', '#81d742', '#1e73be', '#8224e3' ],
_inited: false,
_defaultHSLControls: {
horiz: 's',
vert: 'l',
strip: 'h'
},
_defaultHSVControls: {
horiz: 'h',
vert: 'v',
strip: 's'
},
_scale: {
h: 360,
s: 100,
l: 100,
v: 100
},
_create: function() {
var self = this,
el = self.element,
color = self.options.color || el.val();
if ( gradientType === false ) {
testGradientType();
}
if ( el.is( 'input' ) ) {
if ( self.options.target ) {
self.picker = $( _html ).appendTo( self.options.target );
} else {
self.picker = $( _html ).insertAfter( el );
}
self._addInputListeners( el );
} else {
el.append( _html );
self.picker = el.find( '.iris-picker' );
}
// Browsers / Versions
// Feature detection doesn't work for these, and $.browser is deprecated
if ( isIE ) {
if ( IEVersion === 9 ) {
self.picker.addClass( 'iris-ie-9' );
} else if ( IEVersion <= 8 ) {
self.picker.addClass( 'iris-ie-lt9' );
}
} else if ( UA.indexOf('compatible') < 0 && UA.indexOf('khtml') < 0 && UA.match( /mozilla/ ) ) {
self.picker.addClass( 'iris-mozilla' );
}
if ( self.options.palettes ) {
self._addPalettes();
}
self._color = new Color( color ).setHSpace( self.options.mode );
self.options.color = self._color.toString();
// prep 'em for re-use
self.controls = {
square: self.picker.find( '.iris-square' ),
squareDrag: self.picker.find( '.iris-square-value' ),
horiz: self.picker.find( '.iris-square-horiz' ),
vert: self.picker.find( '.iris-square-vert' ),
strip: self.picker.find( '.iris-strip' ),
stripSlider: self.picker.find( '.iris-strip .iris-slider-offset' )
};
// small sanity check - if we chose hsv, change default controls away from hsl
if ( self.options.mode === 'hsv' && self._has('l', self.options.controls) ) {
self.options.controls = self._defaultHSVControls;
} else if ( self.options.mode === 'hsl' && self._has('v', self.options.controls) ) {
self.options.controls = self._defaultHSLControls;
}
// store it. HSL gets squirrely
self.hue = self._color.h();
if ( self.options.hide ) {
self.picker.hide();
}
if ( self.options.border ) {
self.picker.addClass( 'iris-border' );
}
self._initControls();
self.active = 'external';
self._dimensions();
self._change();
},
_has: function(needle, haystack) {
var ret = false;
$.each(haystack, function(i,v){
if ( needle === v ) {
ret = true;
// exit the loop
return false;
}
});
return ret;
},
_addPalettes: function () {
var container = $( '' ),
palette = $( '' ),
colors = $.isArray( this.options.palettes ) ? this.options.palettes : this._palettes;
// do we have an existing container? Empty and reuse it.
if ( this.picker.find( '.iris-palette-container' ).length ) {
container = this.picker.find( '.iris-palette-container' ).detach().html( '' );
}
$.each(colors, function(index, val) {
palette.clone().data( 'color', val )
.css( 'backgroundColor', val ).appendTo( container )
.height( 10 ).width( 10 );
});
this.picker.append(container);
},
_paint: function() {
var self = this;
self._paintDimension( 'top', 'strip' );
self._paintDimension( 'top', 'vert' );
self._paintDimension( 'left', 'horiz' );
},
_paintDimension: function( origin, control ) {
var self = this,
c = self._color,
mode = self.options.mode,
color = self._getHSpaceColor(),
target = self.controls[ control ],
controlOpts = self.options.controls,
stops;
// don't paint the active control
if ( control === self.active || ( self.active === 'square' && control !== 'strip' ) ) {
return;
}
switch ( controlOpts[ control ] ) {
case 'h':
if ( mode === 'hsv' ) {
color = c.clone();
switch ( control ) {
case 'horiz':
color[controlOpts.vert](100);
break;
case 'vert':
color[controlOpts.horiz](100);
break;
case 'strip':
color.setHSpace('hsl');
break;
}
stops = color.toHsl();
} else {
if ( control === 'strip' ) {
stops = { s: color.s, l: color.l };
} else {
stops = { s: 100, l: color.l };
}
}
target.raninbowGradient( origin, stops );
break;
case 's':
if ( mode === 'hsv' ) {
if ( control === 'vert' ) {
stops = [ c.clone().a(0).s(0).toCSS('rgba'), c.clone().a(1).s(0).toCSS('rgba') ];
} else if ( control === 'strip' ) {
stops = [ c.clone().s(100).toCSS('hsl'), c.clone().s(0).toCSS('hsl') ];
} else if ( control === 'horiz' ) {
stops = [ '#fff', 'hsl(' + color.h + ',100%,50%)' ];
}
} else { // implicit mode === 'hsl'
if ( control === 'vert' && self.options.controls.horiz === 'h' ) {
stops = ['hsla(0, 0%, ' + color.l + '%, 0)', 'hsla(0, 0%, ' + color.l + '%, 1)'];
} else {
stops = ['hsl('+ color.h +',0%,50%)', 'hsl(' + color.h + ',100%,50%)'];
}
}
target.gradient( origin, stops );
break;
case 'l':
if ( control === 'strip' ) {
stops = ['hsl(' + color.h + ',100%,100%)', 'hsl(' + color.h + ', ' + color.s + '%,50%)', 'hsl('+ color.h +',100%,0%)'];
} else {
stops = ['#fff', 'rgba(255,255,255,0) 50%', 'rgba(0,0,0,0) 50%', 'rgba(0,0,0,1)'];
}
target.gradient( origin, stops );
break;
case 'v':
if ( control === 'strip' ) {
stops = [ c.clone().v(100).toCSS(), c.clone().v(0).toCSS() ];
} else {
stops = ['rgba(0,0,0,0)', '#000'];
}
target.gradient( origin, stops );
break;
default:
break;
}
},
_getHSpaceColor: function() {
return ( this.options.mode === 'hsv' ) ? this._color.toHsv() : this._color.toHsl();
},
_dimensions: function( reset ) {
// whatever size
var self = this,
opts = self.options,
controls = self.controls,
square = controls.square,
strip = self.picker.find( '.iris-strip' ),
squareWidth = '77.5%',
stripWidth = '12%',
totalPadding = 20,
innerWidth = opts.border ? opts.width - totalPadding : opts.width,
controlsHeight,
paletteCount = $.isArray( opts.palettes ) ? opts.palettes.length : self._palettes.length,
paletteMargin, paletteWidth, paletteContainerWidth;
if ( reset ) {
square.css( 'width', '' );
strip.css( 'width', '' );
self.picker.css( {width: '', height: ''} );
}
squareWidth = innerWidth * ( parseFloat( squareWidth ) / 100 );
stripWidth = innerWidth * ( parseFloat( stripWidth ) / 100 );
controlsHeight = opts.border ? squareWidth + totalPadding : squareWidth;
square.width( squareWidth ).height( squareWidth );
strip.height( squareWidth ).width( stripWidth );
self.picker.css( { width: opts.width, height: controlsHeight } );
if ( ! opts.palettes ) {
return self.picker.css( 'paddingBottom', '' );
}
// single margin at 2%
paletteMargin = squareWidth * 2 / 100;
paletteContainerWidth = squareWidth - ( ( paletteCount - 1 ) * paletteMargin );
paletteWidth = paletteContainerWidth / paletteCount;
self.picker.find('.iris-palette').each( function( i ) {
var margin = i === 0 ? 0 : paletteMargin;
$( this ).css({
width: paletteWidth,
height: paletteWidth,
marginLeft: margin
});
});
self.picker.css( 'paddingBottom', paletteWidth + paletteMargin );
strip.height( paletteWidth + paletteMargin + squareWidth );
},
_addInputListeners: function( input ) {
var self = this,
debounceTimeout = 100,
callback = function( event ){
var color = new Color( input.val() ),
val = input.val().replace( /^#/, '' );
input.removeClass( 'iris-error' );
// we gave a bad color
if ( color.error ) {
// don't error on an empty input - we want those allowed
if ( val !== '' ) {
input.addClass( 'iris-error' );
}
} else {
if ( color.toString() !== self._color.toString() ) {
// let's not do this on keyup for hex shortcodes
if ( ! ( event.type === 'keyup' && val.match( /^[0-9a-fA-F]{3}$/ ) ) ) {
self._setOption( 'color', color.toString() );
}
}
}
};
input.on( 'change', callback ).on( 'keyup', self._debounce( callback, debounceTimeout ) );
// If we initialized hidden, show on first focus. The rest is up to you.
if ( self.options.hide ) {
input.one( 'focus', function() {
self.show();
});
}
},
_initControls: function() {
var self = this,
controls = self.controls,
square = controls.square,
controlOpts = self.options.controls,
stripScale = self._scale[controlOpts.strip];
controls.stripSlider.slider({
orientation: 'vertical',
max: stripScale,
slide: function( event, ui ) {
self.active = 'strip';
// "reverse" for hue.
if ( controlOpts.strip === 'h' ) {
ui.value = stripScale - ui.value;
}
self._color[controlOpts.strip]( ui.value );
self._change.apply( self, arguments );
}
});
controls.squareDrag.draggable({
containment: controls.square.find( '.iris-square-inner' ),
zIndex: 1000,
cursor: 'move',
drag: function( event, ui ) {
self._squareDrag( event, ui );
},
start: function() {
square.addClass( 'iris-dragging' );
$(this).addClass( 'ui-state-focus' );
},
stop: function() {
square.removeClass( 'iris-dragging' );
$(this).removeClass( 'ui-state-focus' );
}
}).on( 'mousedown mouseup', function( event ) {
var focusClass = 'ui-state-focus';
event.preventDefault();
if (event.type === 'mousedown' ) {
self.picker.find( '.' + focusClass ).removeClass( focusClass ).blur();
$(this).addClass( focusClass ).focus();
} else {
$(this).removeClass( focusClass );
}
}).on( 'keydown', function( event ) {
var container = controls.square,
draggable = controls.squareDrag,
position = draggable.position(),
distance = self.options.width / 100; // Distance in pixels the draggable should be moved: 1 "stop"
// make alt key go "10"
if ( event.altKey ) {
distance *= 10;
}
// Reposition if one of the directional keys is pressed
switch ( event.keyCode ) {
case 37: position.left -= distance; break; // Left
case 38: position.top -= distance; break; // Up
case 39: position.left += distance; break; // Right
case 40: position.top += distance; break; // Down
default: return true; // Exit and bubble
}
// Keep draggable within container
position.left = Math.max( 0, Math.min( position.left, container.width() ) );
position.top = Math.max( 0, Math.min( position.top, container.height() ) );
draggable.css(position);
self._squareDrag( event, { position: position });
event.preventDefault();
});
// allow clicking on the square to move there and keep dragging
square.mousedown( function( event ) {
var squareOffset, pos;
// only left click
if ( event.which !== 1 ) {
return;
}
// prevent bubbling from the handle: no infinite loops
if ( ! $( event.target ).is( 'div' ) ) {
return;
}
squareOffset = self.controls.square.offset();
pos = {
top: event.pageY - squareOffset.top,
left: event.pageX - squareOffset.left
};
event.preventDefault();
self._squareDrag( event, { position: pos } );
event.target = self.controls.squareDrag.get(0);
self.controls.squareDrag.css( pos ).trigger( event );
});
// palettes
if ( self.options.palettes ) {
self._paletteListeners();
}
},
_paletteListeners: function() {
var self = this;
self.picker.find('.iris-palette-container').on('click.palette', '.iris-palette', function() {
self._color.fromCSS( $(this).data('color') );
self.active = 'external';
self._change();
}).on( 'keydown.palette', '.iris-palette', function( event ) {
if ( ! ( event.keyCode === 13 || event.keyCode === 32 ) ) {
return true;
}
event.stopPropagation();
$( this ).click();
});
},
_squareDrag: function( event, ui ) {
var self = this,
controlOpts = self.options.controls,
dimensions = self._squareDimensions(),
vertVal = Math.round( ( dimensions.h - ui.position.top ) / dimensions.h * self._scale[controlOpts.vert] ),
horizVal = self._scale[controlOpts.horiz] - Math.round( ( dimensions.w - ui.position.left ) / dimensions.w * self._scale[controlOpts.horiz] );
self._color[controlOpts.horiz]( horizVal )[controlOpts.vert]( vertVal );
self.active = 'square';
self._change.apply( self, arguments );
},
_setOption: function( key, value ) {
var self = this,
oldValue = self.options[key],
doDimensions = false,
hexLessColor,
newColor,
method;
// ensure the new value is set. We can reset to oldValue if some check wasn't met.
self.options[key] = value;
switch(key) {
case 'color':
// cast to string in case we have a number
value = '' + value;
hexLessColor = value.replace( /^#/, '' );
newColor = new Color( value ).setHSpace( self.options.mode );
if ( newColor.error ) {
self.options[key] = oldValue;
} else {
self._color = newColor;
self.options.color = self.options[key] = self._color.toString();
self.active = 'external';
self._change();
}
break;
case 'palettes':
doDimensions = true;
if ( value ) {
self._addPalettes();
} else {
self.picker.find('.iris-palette-container').remove();
}
// do we need to add events?
if ( ! oldValue ) {
self._paletteListeners();
}
break;
case 'width':
doDimensions = true;
break;
case 'border':
doDimensions = true;
method = value ? 'addClass' : 'removeClass';
self.picker[method]('iris-border');
break;
case 'mode':
case 'controls':
// if nothing's changed, let's bail, since this causes re-rendering the whole widget
if ( oldValue === value ) {
return;
}
// we're using these poorly named variables because they're already scoped.
// method is the element that Iris was called on. oldValue will be the options
method = self.element;
oldValue = self.options;
oldValue.hide = ! self.picker.is( ':visible' );
self.destroy();
self.picker.remove();
return $(self.element).iris(oldValue);
}
// Do we need to recalc dimensions?
if ( doDimensions ) {
self._dimensions(true);
}
},
_squareDimensions: function( forceRefresh ) {
var square = this.controls.square,
dimensions,
control;
if ( forceRefresh !== undef && square.data('dimensions') ) {
return square.data('dimensions');
}
control = this.controls.squareDrag;
dimensions = {
w: square.width(),
h: square.height()
};
square.data( 'dimensions', dimensions );
return dimensions;
},
_isNonHueControl: function( active, type ) {
if ( active === 'square' && this.options.controls.strip === 'h' ) {
return true;
} else if ( type === 'external' || ( type === 'h' && active === 'strip' ) ) {
return false;
}
return true;
},
_change: function() {
var self = this,
controls = self.controls,
color = self._getHSpaceColor(),
actions = [ 'square', 'strip' ],
controlOpts = self.options.controls,
type = controlOpts[self.active] || 'external',
oldHue = self.hue;
if ( self.active === 'strip' ) {
// take no action on any of the square sliders if we adjusted the strip
actions = [];
} else if ( self.active !== 'external' ) {
// for non-strip, non-external, strip should never change
actions.pop(); // conveniently the last item
}
$.each( actions, function(index, item) {
var value, dimensions, cssObj;
if ( item !== self.active ) {
switch ( item ) {
case 'strip':
// reverse for hue
value = ( controlOpts.strip === 'h' ) ? self._scale[controlOpts.strip] - color[controlOpts.strip] : color[controlOpts.strip];
controls.stripSlider.slider( 'value', value );
break;
case 'square':
dimensions = self._squareDimensions();
cssObj = {
left: color[controlOpts.horiz] / self._scale[controlOpts.horiz] * dimensions.w,
top: dimensions.h - ( color[controlOpts.vert] / self._scale[controlOpts.vert] * dimensions.h )
};
self.controls.squareDrag.css( cssObj );
break;
}
}
});
// Ensure that we don't change hue if we triggered a hue reset
if ( color.h !== oldHue && self._isNonHueControl( self.active, type ) ) {
self._color.h(oldHue);
}
// store hue for repeating above check next time
self.hue = self._color.h();
self.options.color = self._color.toString();
// only run after the first time
if ( self._inited ) {
self._trigger( 'change', { type: self.active }, { color: self._color } );
}
if ( self.element.is( ':input' ) && ! self._color.error ) {
self.element.removeClass( 'iris-error' );
if ( self.element.val() !== self._color.toString() ) {
self.element.val( self._color.toString() );
}
}
self._paint();
self._inited = true;
self.active = false;
},
// taken from underscore.js _.debounce method
_debounce: function( func, wait, immediate ) {
var timeout, result;
return function() {
var context = this,
args = arguments,
later,
callNow;
later = function() {
timeout = null;
if ( ! immediate) {
result = func.apply( context, args );
}
};
callNow = immediate && !timeout;
clearTimeout( timeout );
timeout = setTimeout( later, wait );
if ( callNow ) {
result = func.apply( context, args );
}
return result;
};
},
show: function() {
this.picker.show();
},
hide: function() {
this.picker.hide();
},
toggle: function() {
this.picker.toggle();
},
color: function(newColor) {
if ( newColor === true ) {
return this._color.clone();
} else if ( newColor === undef ) {
return this._color.toString();
}
this.option('color', newColor);
}
};
// initialize the widget
$.widget( 'a8c.iris', Iris );
// add CSS
$( '' ).appendTo( 'head' );
}( jQuery ));
/*! Color.js - v0.9.11 - 2013-08-09
* https://github.com/Automattic/Color.js
* Copyright (c) 2013 Matt Wiebe; Licensed GPLv2 */
(function(global, undef) {
var Color = function( color, type ) {
if ( ! ( this instanceof Color ) )
return new Color( color, type );
return this._init( color, type );
};
Color.fn = Color.prototype = {
_color: 0,
_alpha: 1,
error: false,
// for preserving hue/sat in fromHsl().toHsl() flows
_hsl: { h: 0, s: 0, l: 0 },
// for preserving hue/sat in fromHsv().toHsv() flows
_hsv: { h: 0, s: 0, v: 0 },
// for setting hsl or hsv space - needed for .h() & .s() functions to function properly
_hSpace: 'hsl',
_init: function( color ) {
var func = 'noop';
switch ( typeof color ) {
case 'object':
// alpha?
if ( color.a !== undef )
this.a( color.a );
func = ( color.r !== undef ) ? 'fromRgb' :
( color.l !== undef ) ? 'fromHsl' :
( color.v !== undef ) ? 'fromHsv' : func;
return this[func]( color );
case 'string':
return this.fromCSS( color );
case 'number':
return this.fromInt( parseInt( color, 10 ) );
}
return this;
},
_error: function() {
this.error = true;
return this;
},
clone: function() {
var newColor = new Color( this.toInt() ),
copy = ['_alpha', '_hSpace', '_hsl', '_hsv', 'error'];
for ( var i = copy.length - 1; i >= 0; i-- ) {
newColor[ copy[i] ] = this[ copy[i] ];
}
return newColor;
},
setHSpace: function( space ) {
this._hSpace = ( space === 'hsv' ) ? space : 'hsl';
return this;
},
noop: function() {
return this;
},
fromCSS: function( color ) {
var list,
leadingRE = /^(rgb|hs(l|v))a?\(/;
this.error = false;
// whitespace and semicolon trim
color = color.replace(/^\s+/, '').replace(/\s+$/, '').replace(/;$/, '');
if ( color.match(leadingRE) && color.match(/\)$/) ) {
list = color.replace(/(\s|%)/g, '').replace(leadingRE, '').replace(/,?\);?$/, '').split(',');
if ( list.length < 3 )
return this._error();
if ( list.length === 4 ) {
this.a( parseFloat( list.pop() ) );
// error state has been set to true in .a() if we passed NaN
if ( this.error )
return this;
}
for (var i = list.length - 1; i >= 0; i--) {
list[i] = parseInt(list[i], 10);
if ( isNaN( list[i] ) )
return this._error();
}
if ( color.match(/^rgb/) ) {
return this.fromRgb( {
r: list[0],
g: list[1],
b: list[2]
} );
} else if ( color.match(/^hsv/) ) {
return this.fromHsv( {
h: list[0],
s: list[1],
v: list[2]
} );
} else {
return this.fromHsl( {
h: list[0],
s: list[1],
l: list[2]
} );
}
} else {
// must be hex amirite?
return this.fromHex( color );
}
},
fromRgb: function( rgb, preserve ) {
if ( typeof rgb !== 'object' || rgb.r === undef || rgb.g === undef || rgb.b === undef )
return this._error();
this.error = false;
return this.fromInt( parseInt( ( rgb.r << 16 ) + ( rgb.g << 8 ) + rgb.b, 10 ), preserve );
},
fromHex: function( color ) {
color = color.replace(/^#/, '').replace(/^0x/, '');
if ( color.length === 3 ) {
color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];
}
// rough error checking - this is where things go squirrely the most
this.error = ! /^[0-9A-F]{6}$/i.test( color );
return this.fromInt( parseInt( color, 16 ) );
},
fromHsl: function( hsl ) {
var r, g, b, q, p, h, s, l;
if ( typeof hsl !== 'object' || hsl.h === undef || hsl.s === undef || hsl.l === undef )
return this._error();
this._hsl = hsl; // store it
this._hSpace = 'hsl'; // implicit
h = hsl.h / 360; s = hsl.s / 100; l = hsl.l / 100;
if ( s === 0 ) {
r = g = b = l; // achromatic
}
else {
q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
p = 2 * l - q;
r = this.hue2rgb( p, q, h + 1/3 );
g = this.hue2rgb( p, q, h );
b = this.hue2rgb( p, q, h - 1/3 );
}
return this.fromRgb( {
r: r * 255,
g: g * 255,
b: b * 255
}, true ); // true preserves hue/sat
},
fromHsv: function( hsv ) {
var h, s, v, r, g, b, i, f, p, q, t;
if ( typeof hsv !== 'object' || hsv.h === undef || hsv.s === undef || hsv.v === undef )
return this._error();
this._hsv = hsv; // store it
this._hSpace = 'hsv'; // implicit
h = hsv.h / 360; s = hsv.s / 100; v = hsv.v / 100;
i = Math.floor( h * 6 );
f = h * 6 - i;
p = v * ( 1 - s );
q = v * ( 1 - f * s );
t = v * ( 1 - ( 1 - f ) * s );
switch( i % 6 ) {
case 0:
r = v; g = t; b = p;
break;
case 1:
r = q; g = v; b = p;
break;
case 2:
r = p; g = v; b = t;
break;
case 3:
r = p; g = q; b = v;
break;
case 4:
r = t; g = p; b = v;
break;
case 5:
r = v; g = p; b = q;
break;
}
return this.fromRgb( {
r: r * 255,
g: g * 255,
b: b * 255
}, true ); // true preserves hue/sat
},
// everything comes down to fromInt
fromInt: function( color, preserve ) {
this._color = parseInt( color, 10 );
if ( isNaN( this._color ) )
this._color = 0;
// let's coerce things
if ( this._color > 16777215 )
this._color = 16777215;
else if ( this._color < 0 )
this._color = 0;
// let's not do weird things
if ( preserve === undef ) {
this._hsv.h = this._hsv.s = this._hsl.h = this._hsl.s = 0;
}
// EVENT GOES HERE
return this;
},
hue2rgb: function( p, q, t ) {
if ( t < 0 ) {
t += 1;
}
if ( t > 1 ) {
t -= 1;
}
if ( t < 1/6 ) {
return p + ( q - p ) * 6 * t;
}
if ( t < 1/2 ) {
return q;
}
if ( t < 2/3 ) {
return p + ( q - p ) * ( 2/3 - t ) * 6;
}
return p;
},
toString: function() {
var hex = parseInt( this._color, 10 ).toString( 16 );
if ( this.error )
return '';
// maybe left pad it
if ( hex.length < 6 ) {
for (var i = 6 - hex.length - 1; i >= 0; i--) {
hex = '0' + hex;
}
}
return '#' + hex;
},
toCSS: function( type, alpha ) {
type = type || 'hex';
alpha = parseFloat( alpha || this._alpha );
switch ( type ) {
case 'rgb':
case 'rgba':
var rgb = this.toRgb();
if ( alpha < 1 ) {
return "rgba( " + rgb.r + ", " + rgb.g + ", " + rgb.b + ", " + alpha + " )";
}
else {
return "rgb( " + rgb.r + ", " + rgb.g + ", " + rgb.b + " )";
}
break;
case 'hsl':
case 'hsla':
var hsl = this.toHsl();
if ( alpha < 1 ) {
return "hsla( " + hsl.h + ", " + hsl.s + "%, " + hsl.l + "%, " + alpha + " )";
}
else {
return "hsl( " + hsl.h + ", " + hsl.s + "%, " + hsl.l + "% )";
}
break;
default:
return this.toString();
}
},
toRgb: function() {
return {
r: 255 & ( this._color >> 16 ),
g: 255 & ( this._color >> 8 ),
b: 255 & ( this._color )
};
},
toHsl: function() {
var rgb = this.toRgb();
var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
var max = Math.max( r, g, b ), min = Math.min( r, g, b );
var h, s, l = ( max + min ) / 2;
if ( max === min ) {
h = s = 0; // achromatic
} else {
var d = max - min;
s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
switch ( max ) {
case r: h = ( g - b ) / d + ( g < b ? 6 : 0 );
break;
case g: h = ( b - r ) / d + 2;
break;
case b: h = ( r - g ) / d + 4;
break;
}
h /= 6;
}
// maintain hue & sat if we've been manipulating things in the HSL space.
h = Math.round( h * 360 );
if ( h === 0 && this._hsl.h !== h ) {
h = this._hsl.h;
}
s = Math.round( s * 100 );
if ( s === 0 && this._hsl.s ) {
s = this._hsl.s;
}
return {
h: h,
s: s,
l: Math.round( l * 100 )
};
},
toHsv: function() {
var rgb = this.toRgb();
var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
var max = Math.max( r, g, b ), min = Math.min( r, g, b );
var h, s, v = max;
var d = max - min;
s = max === 0 ? 0 : d / max;
if ( max === min ) {
h = s = 0; // achromatic
} else {
switch( max ){
case r:
h = ( g - b ) / d + ( g < b ? 6 : 0 );
break;
case g:
h = ( b - r ) / d + 2;
break;
case b:
h = ( r - g ) / d + 4;
break;
}
h /= 6;
}
// maintain hue & sat if we've been manipulating things in the HSV space.
h = Math.round( h * 360 );
if ( h === 0 && this._hsv.h !== h ) {
h = this._hsv.h;
}
s = Math.round( s * 100 );
if ( s === 0 && this._hsv.s ) {
s = this._hsv.s;
}
return {
h: h,
s: s,
v: Math.round( v * 100 )
};
},
toInt: function() {
return this._color;
},
toIEOctoHex: function() {
// AARRBBGG
var hex = this.toString();
var AA = parseInt( 255 * this._alpha, 10 ).toString(16);
if ( AA.length === 1 ) {
AA = '0' + AA;
}
return '#' + AA + hex.replace(/^#/, '' );
},
toLuminosity: function() {
var rgb = this.toRgb();
return 0.2126 * Math.pow( rgb.r / 255, 2.2 ) + 0.7152 * Math.pow( rgb.g / 255, 2.2 ) + 0.0722 * Math.pow( rgb.b / 255, 2.2);
},
getDistanceLuminosityFrom: function( color ) {
if ( ! ( color instanceof Color ) ) {
throw 'getDistanceLuminosityFrom requires a Color object';
}
var lum1 = this.toLuminosity();
var lum2 = color.toLuminosity();
if ( lum1 > lum2 ) {
return ( lum1 + 0.05 ) / ( lum2 + 0.05 );
}
else {
return ( lum2 + 0.05 ) / ( lum1 + 0.05 );
}
},
getMaxContrastColor: function() {
var lum = this.toLuminosity();
var hex = ( lum >= 0.5 ) ? '000000' : 'ffffff';
return new Color( hex );
},
getReadableContrastingColor: function( bgColor, minContrast ) {
if ( ! bgColor instanceof Color ) {
return this;
}
// you shouldn't use less than 5, but you might want to.
var targetContrast = ( minContrast === undef ) ? 5 : minContrast;
// working things
var contrast = bgColor.getDistanceLuminosityFrom( this );
var maxContrastColor = bgColor.getMaxContrastColor();
var maxContrast = maxContrastColor.getDistanceLuminosityFrom( bgColor );
// if current max contrast is less than the target contrast, we had wishful thinking.
// still, go max
if ( maxContrast <= targetContrast ) {
return maxContrastColor;
}
// or, we might already have sufficient contrast
else if ( contrast >= targetContrast ) {
return this;
}
var incr = ( 0 === maxContrastColor.toInt() ) ? -1 : 1;
while ( contrast < targetContrast ) {
this.l( incr, true ); // 2nd arg turns this into an incrementer
contrast = this.getDistanceLuminosityFrom( bgColor );
// infininite loop prevention: you never know.
if ( this._color === 0 || this._color === 16777215 ) {
break;
}
}
return this;
},
a: function( val ) {
if ( val === undef )
return this._alpha;
var a = parseFloat( val );
if ( isNaN( a ) )
return this._error();
this._alpha = a;
return this;
},
// TRANSFORMS
darken: function( amount ) {
amount = amount || 5;
return this.l( - amount, true );
},
lighten: function( amount ) {
amount = amount || 5;
return this.l( amount, true );
},
saturate: function( amount ) {
amount = amount || 15;
return this.s( amount, true );
},
desaturate: function( amount ) {
amount = amount || 15;
return this.s( - amount, true );
},
toGrayscale: function() {
return this.setHSpace('hsl').s( 0 );
},
getComplement: function() {
return this.h( 180, true );
},
getSplitComplement: function( step ) {
step = step || 1;
var incr = 180 + ( step * 30 );
return this.h( incr, true );
},
getAnalog: function( step ) {
step = step || 1;
var incr = step * 30;
return this.h( incr, true );
},
getTetrad: function( step ) {
step = step || 1;
var incr = step * 60;
return this.h( incr, true );
},
getTriad: function( step ) {
step = step || 1;
var incr = step * 120;
return this.h( incr, true );
},
_partial: function( key ) {
var prop = shortProps[key];
return function( val, incr ) {
var color = this._spaceFunc('to', prop.space);
// GETTER
if ( val === undef )
return color[key];
// INCREMENT
if ( incr === true )
val = color[key] + val;
// MOD & RANGE
if ( prop.mod )
val = val % prop.mod;
if ( prop.range )
val = ( val < prop.range[0] ) ? prop.range[0] : ( val > prop.range[1] ) ? prop.range[1] : val;
// NEW VALUE
color[key] = val;
return this._spaceFunc('from', prop.space, color);
};
},
_spaceFunc: function( dir, s, val ) {
var space = s || this._hSpace,
funcName = dir + space.charAt(0).toUpperCase() + space.substr(1);
return this[funcName](val);
}
};
var shortProps = {
h: {
mod: 360
},
s: {
range: [0,100]
},
l: {
space: 'hsl',
range: [0,100]
},
v: {
space: 'hsv',
range: [0,100]
},
r: {
space: 'rgb',
range: [0,255]
},
g: {
space: 'rgb',
range: [0,255]
},
b: {
space: 'rgb',
range: [0,255]
}
};
for ( var key in shortProps ) {
if ( shortProps.hasOwnProperty( key ) )
Color.fn[key] = Color.fn._partial(key);
}
// play nicely with Node + browser
if ( typeof exports === 'object' )
module.exports = Color;
else
global.Color = Color;
}(this));
jQuery(function () {
/**
* Function to reload the preview styles in the main window
*
* @param {Window} target the main window
*/
function applyPreview(target) {
// remove style
var $style = target.jQuery('link[rel=stylesheet][href*="lib/exe/css.php"]');
$style.attr('href', '');
// append the loader screen
var $loader = target.jQuery('#plugin__styling_loader');
if (!$loader.length) {
$loader = target.jQuery('
' + LANG.plugins.styling.loader + '
');
$loader.css({
'position': 'absolute',
'width': '100%',
'height': '100%',
'top': 0,
'left': 0,
'z-index': 5000,
'background-color': '#fff',
'opacity': '0.7',
'color': '#000',
'font-size': '2.5em',
'text-align': 'center',
'line-height': 1.5,
'padding-top': '2em'
});
target.jQuery('body').append($loader);
}
// load preview in main window (timeout works around chrome updating CSS weirdness)
setTimeout(function () {
var now = new Date().getTime();
$style.attr('href', DOKU_BASE + 'lib/exe/css.php?preview=1&tseed=' + now);
}, 500);
}
var doreload = 1;
var $styling_plugin = jQuery('#plugin__styling');
// if we are not on the plugin page (either main or popup)
if (!$styling_plugin.length) {
// handle the preview cookie
if(DokuCookie.getValue('styling_plugin') == 1) {
applyPreview(window);
}
return; // nothing more to do here
}
/* ---- from here on we're in the popup or admin page ---- */
// add the color picker
$styling_plugin.find('.color').iris({});
// add button on main page
if (!$styling_plugin.hasClass('ispopup')) {
var $form = $styling_plugin.find('form.styling').first();
var $btn = jQuery('');
$form.prepend($btn);
$btn.click(function (e) {
var windowFeatures = "menubar=no,location=no,resizable=yes,scrollbars=yes,status=false,width=500,height=500";
window.open(DOKU_BASE + 'lib/plugins/styling/popup.php', 'styling_popup', windowFeatures);
e.preventDefault();
e.stopPropagation();
}).wrap('');
return; // we exit here if this is not the popup
}
/* ---- from here on we're in the popup only ---- */
// reload the main page on close
window.onunload = function(e) {
if(doreload) {
window.opener.DokuCookie.setValue('styling_plugin', 0);
window.opener.document.location.reload();
}
return null;
};
// don't reload on our own buttons
jQuery(':button').click(function(e){
doreload = false;
});
// on first load apply preview
applyPreview(window.opener);
// enable the preview cookie
window.opener.DokuCookie.setValue('styling_plugin', 1);
});
} catch (e) {
logError(e, 'lib/plugins/styling/script.js');
}
/* XXXXXXXXXX end of lib/plugins/styling/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/acl/script.js XXXXXXXXXX */
try {
/**
* ACL Manager AJAX enhancements
*
* @author Andreas Gohr
*/
var dw_acl = {
/**
* Initialize the object and attach the event handlers
*/
init: function () {
var $tree;
//FIXME only one underscore!!
if (jQuery('#acl_manager').length === 0) {
return;
}
jQuery('#acl__user select').change(dw_acl.userselhandler);
jQuery('#acl__user button').click(dw_acl.loadinfo);
$tree = jQuery('#acl__tree');
$tree.dw_tree({toggle_selector: 'img',
load_data: function (show_sublist, $clicky) {
// get the enclosed link and the edit form
var $frm = jQuery('#acl__detail form');
jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
jQuery.extend(dw_acl.parseatt($clicky.parent().find('a')[0].search),
{call: 'plugin_acl',
ajax: 'tree',
current_ns: $frm.find('input[name=ns]').val(),
current_id: $frm.find('input[name=id]').val()}),
show_sublist,
'html'
);
},
toggle_display: function ($clicky, opening) {
$clicky.attr('src',
DOKU_BASE + 'lib/images/' +
(opening ? 'minus' : 'plus') + '.gif');
}});
$tree.delegate('a', 'click', dw_acl.treehandler);
},
/**
* Handle user dropdown
*
* Hides or shows the user/group entry box depending on what was selected in the
* dropdown element
*/
userselhandler: function () {
// make entry field visible/invisible
jQuery('#acl__user input').toggle(this.value === '__g__' ||
this.value === '__u__');
dw_acl.loadinfo();
},
/**
* Load the current permission info and edit form
*/
loadinfo: function () {
jQuery('#acl__info')
.attr('role', 'alert')
.html('')
.load(
DOKU_BASE + 'lib/exe/ajax.php',
jQuery('#acl__detail form').serialize() + '&call=plugin_acl&ajax=info'
);
return false;
},
/**
* parse URL attributes into a associative array
*
* @todo put into global script lib?
*/
parseatt: function (str) {
if (str[0] === '?') {
str = str.substr(1);
}
var attributes = {};
var all = str.split('&');
for (var i = 0; i < all.length; i++) {
var att = all[i].split('=');
attributes[att[0]] = decodeURIComponent(att[1]);
}
return attributes;
},
/**
* Handles clicks to the tree nodes
*/
treehandler: function () {
var $link, $frm;
$link = jQuery(this);
// remove highlighting
jQuery('#acl__tree a.cur').removeClass('cur');
// add new highlighting
$link.addClass('cur');
// set new page to detail form
$frm = jQuery('#acl__detail form');
if ($link.hasClass('wikilink1')) {
$frm.find('input[name=ns]').val('');
$frm.find('input[name=id]').val(dw_acl.parseatt($link[0].search).id);
} else if ($link.hasClass('idx_dir')) {
$frm.find('input[name=ns]').val(dw_acl.parseatt($link[0].search).ns);
$frm.find('input[name=id]').val('');
}
dw_acl.loadinfo();
return false;
}
};
jQuery(dw_acl.init);
} catch (e) {
logError(e, 'lib/plugins/acl/script.js');
}
/* XXXXXXXXXX end of lib/plugins/acl/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/translation/script.js XXXXXXXXXX */
try {
/**
* Remove go button from translation dropdown
*/
jQuery(function(){
var $frm = jQuery('#translation__dropdown');
if(!$frm.length) return;
$frm.find('input[name=go]').hide();
$frm.find('select[name=id]').change(function(){
var id = jQuery(this).val();
// this should hopefully detect rewriting good enough:
var action = $frm.attr('action');
if(action.substr(action.length-1) == '/'){
var link = action + id;
}else{
var link = action + '?id=' + id;
}
window.location.href= link;
});
});
} catch (e) {
logError(e, 'lib/plugins/translation/script.js');
}
/* XXXXXXXXXX end of lib/plugins/translation/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/extension/script.js XXXXXXXXXX */
try {
jQuery(function(){
var $extmgr = jQuery('#extension__manager');
/**
* Confirm uninstalling
*/
$extmgr.find('button.uninstall').click(function(e){
if(!window.confirm(LANG.plugins.extension.reallydel)){
e.preventDefault();
return false;
}
return true;
});
/**
* very simple lightbox
* @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/
*/
$extmgr.find('a.extension_screenshot').click(function(e) {
e.preventDefault();
//Get clicked link href
var image_href = jQuery(this).attr("href");
// create lightbox if needed
var $lightbox = jQuery('#plugin__extensionlightbox');
if(!$lightbox.length){
$lightbox = jQuery('
Click to close
')
.appendTo(jQuery('body'))
.hide()
.click(function(){
$lightbox.hide();
});
}
// fill and show it
$lightbox
.show()
.find('div').html('');
return false;
});
/**
* Enable/Disable extension via AJAX
*/
$extmgr.find('button.disable, button.enable').click(function (e) {
e.preventDefault();
var $btn = jQuery(this);
// get current state
var extension = $btn.attr('name').split('[')[2];
extension = extension.substr(0, extension.length - 1);
var act = ($btn.hasClass('disable')) ? 'disable' : 'enable';
// disable while we wait
$btn.attr('disabled', 'disabled');
$btn.css('cursor', 'wait');
// execute
jQuery.get(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'plugin_extension',
ext: extension,
act: act
},
function (data) {
$btn.css('cursor', '')
.removeAttr('disabled')
.removeClass('disable')
.removeClass('enable')
.text(data.label)
.addClass(data.reverse)
.parents('li')
.removeClass('disabled')
.removeClass('enabled')
.addClass(data.state);
}
);
});
/**
* AJAX detail infos
*/
$extmgr.find('a.info').click(function(e){
e.preventDefault();
var $link = jQuery(this);
var $details = $link.parent().find('dl.details');
if($details.length){
$link.toggleClass('close');
$details.toggle();
return;
}
$link.addClass('close');
jQuery.get(
DOKU_BASE + 'lib/exe/ajax.php',
{
call: 'plugin_extension',
ext: $link.data('extid'),
act: 'info'
},
function(data){
$link.parent().append(data);
}
);
});
/**
Create section for enabling/disabling viewing options
*/
if ( $extmgr.find('.plugins, .templates').hasClass('active') ) {
var $extlist = jQuery('#extension__list');
$extlist.addClass('hasDisplayOptions');
var $displayOpts = jQuery('
', { id: 'extension__viewoptions'} ).appendTo($extmgr.find( '.panelHeader' ));
$displayOpts.append(LANG.plugins.extension.display_viewoptions);
var displayOptionsHandler = function(){
$extlist.toggleClass( this.name );
DokuCookie.setValue('ext_'+this.name, $extlist.hasClass(this.name) ? '1' : '0');
};
jQuery(['enabled', 'disabled', 'updatable']).each(function(index, chkName){
var $label = jQuery( '' )
.appendTo($displayOpts);
var $input = jQuery( '', { type: 'checkbox', name: chkName })
.change(displayOptionsHandler)
.appendTo($label);
var previous = DokuCookie.getValue('ext_'+chkName);
if(typeof previous === "undefined" || previous == '1') {
$input.click();
}
jQuery( '' )
.append(' '+LANG.plugins.extension['display_'+chkName])
.appendTo($label);
});
}
});
} catch (e) {
logError(e, 'lib/plugins/extension/script.js');
}
/* XXXXXXXXXX end of lib/plugins/extension/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/usermanager/script.js XXXXXXXXXX */
try {
/**
* Add JavaScript confirmation to the User Delete button
*/
jQuery(function(){
jQuery('#usrmgr__del').click(function(){
return confirm(LANG.del_confirm);
});
});
} catch (e) {
logError(e, 'lib/plugins/usermanager/script.js');
}
/* XXXXXXXXXX end of lib/plugins/usermanager/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/pagequery/script.js XXXXXXXXXX */
try {
/**
* Button action for the floating dialog
*
* @param DOMElement btn Button element to add the action to
* @param array props Associative array of button properties
* @param string edid ID of the editor textarea
*/
function tb_dialog(btn, props, edid) {
var content = props['html'];
jQuery(content).dialog({
autoOpen: false,
modal: false,
width: 475,
height: 295
}).dialog("open");
return false;
}
} catch (e) {
logError(e, 'lib/plugins/pagequery/script.js');
}
/* XXXXXXXXXX end of lib/plugins/pagequery/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/addnewpage/script.js XXXXXXXXXX */
try {
jQuery(document).ready(function() {
// Start with disabled submit button
jQuery(".addnewpage :submit").prop("disabled", true);
// Then enable it when a title is entered
jQuery(".addnewpage input[name='title']").keyup(function(){
var $submit = jQuery(this).parent("form").find(":submit");
if (jQuery(this).val().length > 0) {
$submit.removeAttr("disabled");
} else {
// For when the user deletes the text
$submit.attr("disabled", "disabled");
}
}).keyup();
// Change the form's page-ID field on submit
jQuery(".addnewpage form").submit(function(e) {
// Build the new page ID and save in hidden form field
var ns = jQuery(this).find("[name='np_cat']");
var title = jQuery(this).find("input[name='title']");
var id = ns.val()+":"+title.val();
jQuery(this).find("input[name='id']").val(id);
// Clean up the form vars, just to make the resultant URL a bit nicer
ns.prop("disabled", true);
title.prop("disabled", true);
return true;
});
});
} catch (e) {
logError(e, 'lib/plugins/addnewpage/script.js');
}
/* XXXXXXXXXX end of lib/plugins/addnewpage/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/searchindex/script.js XXXXXXXXXX */
try {
/**
* Javascript for searchindex manager plugin
*
* @author Andreas Gohr
* @author Symon Bent
* Complete rewrite using jQuery and revealing module pattern
* Separate update and rebuild options
*/
var plugin_searchindex = (function() {
// public methods/properties
var pub = {};
// private vars
var pages = null,
page = null,
url = null,
done = 1,
count = 0,
$msg = null,
$buttons = null,
lang = null;
force = '';
/**
* initialize everything
*/
pub.init = function() {
$msg = jQuery('#plugin__searchindex_msg');
if( ! $msg) return;
lang = LANG.plugins.searchindex;
url = DOKU_BASE + 'lib/plugins/searchindex/ajax.php';
$buttons = jQuery('#plugin__searchindex_buttons');
// init interface events
jQuery('#plugin__searchindex_update').click(pub.update);
jQuery('#plugin__searchindex_rebuild').click(pub.rebuild);
};
/**
* Gives textual feedback
*/
var message = function(text) {
if (text.charAt(0) !== '<') {
text = '
' + text + '
'
}
$msg.html(text);
};
/**
* Starts the indexing of a page.
*/
var index = function() {
if (page) {
jQuery.post(url, 'call=indexpage&page=' + encodeURI(page) + '&force=' + force, function(response) {
var wait = 250;
// next page from queue
page = pages.shift();
done++;
var msg = (response !== 'true') ? lang.notindexed : lang.indexed;
status = '
' + msg + '
';
message('
' + lang.indexing + ' ' + done + '/' + count + '
' + page + '
' + status);
// next index run
window.setTimeout(index, wait);
});
} else {
finished();
}
};
var finished = function() {
// we're done
throbber_off();
message(lang.done);
window.setTimeout(function() {
message('');
$buttons.show('slow');
}, 3000);
};
/**
* Cleans the index (ready for complete rebuild)
*/
var clear = function() {
message(lang.clearing);
jQuery.post(url, 'call=clearindex', function(response) {
if (response !== 'true') {
message(response);
// retry
window.setTimeout(clear,5000);
} else {
// start indexing
force = 'true';
window.setTimeout(index,1000);
}
});
};
pub.rebuild = function() {
pub.update(true);
};
/**
* Starts the index update
*/
pub.update = function(rebuild) {
done = 1;
rebuild = rebuild || false;
$buttons.hide('slow');
throbber_on();
message(lang.finding);
jQuery.post(url, 'call=pagelist', function(response) {
if (response !== 'true') {
pages = response.split("\n");
count = pages.length;
message(lang.pages.replace(/%d/, pages.length));
// move the first page from the queue
page = pages.shift();
// complete index rebuild?
if (rebuild === true) {
clear();
} else {
force = '';
// just start indexing immediately
window.setTimeout(index,1000);
}
} else {
finished();
}
});
};
/**
* add a throbber image
*/
var throbber_on = function() {
$msg.addClass('updating');
};
/**
* Stop the throbber
*/
var throbber_off = function() {
$msg.removeClass('updating');
};
// return only public methods/properties
return pub;
})();
jQuery(function() {
plugin_searchindex.init();
});
} catch (e) {
logError(e, 'lib/plugins/searchindex/script.js');
}
/* XXXXXXXXXX end of lib/plugins/searchindex/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/tag/script.js XXXXXXXXXX */
try {
/**
* For the searchtags syntax: make the checkboxes behave like radio buttons
* so the user can't both include and exclude a tag
*/
jQuery(function() {
jQuery('form.plugin__tag_search table input').change(function() {
if (jQuery(this).attr('checked')) { // was this input checked?
if (jQuery(this).parent().hasClass('minus')) {
// find the other input in the same tr and uncheck it
jQuery(this).closest('tr').find('.plus input').attr('checked', false);
} else {
jQuery(this).closest('tr').find('.minus input').attr('checked', false);
}
}
})
});
} catch (e) {
logError(e, 'lib/plugins/tag/script.js');
}
/* XXXXXXXXXX end of lib/plugins/tag/script.js XXXXXXXXXX */
/* XXXXXXXXXX begin of lib/plugins/include/script.js XXXXXXXXXX */
try {
/**
* Javascript functionality for the include plugin
*/
/**
* Highlight the included section when hovering over the appropriate include edit button
*
* @author Andreas Gohr
* @author Michael Klier
* @author Michael Hamann
*/
jQuery(function() {
jQuery('.btn_incledit')
.mouseover(function () {
jQuery(this).closest('.plugin_include_content').addClass('section_highlight');
})
.mouseout(function () {
jQuery('.section_highlight').removeClass('section_highlight');
});
});
// vim:ts=4:sw=4:et:
} catch (e) {
logError(e, 'lib/plugins/include/script.js');
}
/* XXXXXXXXXX end of lib/plugins/include/script.js XXXXXXXXXX */
jQuery(function(){ dw_locktimer.init(1140,1); });